我知道这是未定义的行为:
int i = 0;
int a[4];
a[i] = i++; //<--- UB here
i
因为左侧和右侧的评估顺序未定义(这;
是唯一的序列点)。
进一步推理,在我看来,这将是不明确的未指定的行为:
int i = 0;
int foo(){
return i++;
}
int main(){
int a[4];
a[i] = foo();
return 0;
}
=
尽管据我所知,右侧有几个序列点仍然是不明确的未指定是否先评估f()
或a[i]
先评估。
我的假设正确吗?当我在赋值的左侧使用全局或静态变量而右手在任何情况下都不会修改它时,我是否必须小心谨慎?