我正在阅读C bug材料并且说:
在单个表达式中,我们可能无法猜测它的顺序 副作用。如下面的代码部分所示,取决于 使用的编译器,i / ++可能是0或1
...
int i = 1;
int ii = i /++ i ;
...
你能告诉我原因吗?
此帖子有关闭问题 Why does the expression a = a + b - ( b = a ) give a sequence point warning in c++?
答案 0 :(得分:1)
运算符优先级是关于制作树,它不会影响评估顺序。
每个编译器中的树应该看起来像((ii) = ((i) / (++(i))))
。
另一方面,评估顺序未经过验证,因此我们无法确定先前评估左手i
和右手++i
中的哪一个。
如果先评估前者,则表达式为1 / 2
,但如果先评估后者,则表达式为2 / 2
。
N1256 6.5表达式
2在前一个和下一个序列点之间,一个对象应具有其存储的值 通过表达式的评估最多修改一次。 72)此外,先前的价值 应只读以确定要存储的值。 73)
3语法指示运算符和操作数的分组。 74)除非另有说明 稍后(对于函数调用(),&&,||,?:和逗号运算符),评估顺序 子表达式和副作用发生的顺序都是未指定的。