未定义的副作用顺序

时间:2016-02-21 02:46:03

标签: c

我正在阅读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++?

1 个答案:

答案 0 :(得分:1)

运算符优先级是关于制作树,它不会影响评估顺序。

每个编译器中的树应该看起来像((ii) = ((i) / (++(i))))

另一方面,评估顺序未经过验证,因此我们无法确定先前评估左手i和右手++i中的哪一个。 如果先评估前者,则表达式为1 / 2,但如果先评估后者,则表达式为2 / 2

N1256 6.5表达式

  

2在前一个和下一个序列点之间,一个对象应具有其存储的值   通过表达式的评估最多修改一次。 72)此外,先前的价值   应只读以确定要存储的值。 73)
  3语法指示运算符和操作数的分组。 74)除非另有说明   稍后(对于函数调用(),&&,||,?:和逗号运算符),评估顺序   子表达式和副作用发生的顺序都是未指定的。