【发布时间】:2014-05-21 08:45:06
【问题描述】:
我了解这是未定义的行为:
int i = 0;
int a[4];
a[i] = i++; //<--- UB here
因为i 对左侧和右侧的求值顺序未定义(; 是唯一的序列点)。
进一步推理,在我看来,这将是 undefined 未指定的行为:
int i = 0;
int foo(){
return i++;
}
int main(){
int a[4];
a[i] = foo();
return 0;
}
尽管= 的右侧有几个序列点,据我了解,仍然undefined 未指定首先评估f() 还是a[i]。
我的假设是否正确?当我在赋值的左侧使用全局或静态变量而右手在任何情况下都不会修改它时,我是否必须小心谨慎?
【问题讨论】:
-
评估顺序未指定,不是未定义。
-
函数中的排序仅针对函数。没有定义哪个会先发生,
a的取消引用或函数调用。 -
@chris 感谢您的更正,我的修复正确吗?即第一个未定义而第二个未指定?
-
@PorkyBrain,在第一个 sn-p 下还有一个,但我同意 jrok 的答案。您不会知道它得到什么值,但它会具有两个可能的值之一。
标签: c++ sequence-points