为什么这个未定义的行为?

时间:2010-11-05 11:40:10

标签: c++ undefined-behavior sequence-points

为什么以下给定的表达式会调用未定义的行为?

int i = 5;
i = (i,i++,i) + 1 

我的问题受到Als'question here

的影响

3 个答案:

答案 0 :(得分:11)

这不是未定义的。

这里回答了C,Sequence points and partial order

我认为同样适用于C ++(这是我在看到该链接之前的回复):

逗号运算符引入了一个序列点(并在某种程度上约束了表达式必须被评估的顺序 - 在右边之前),所以:

  • i的两个修改由序列点(第二个逗号)分隔。
  • ii++的修改与序列点的其他内容分开。
  • i =的修改 与表达式中最后一次出现的i分开,但是没关系,因为我们被允许如果访问是“确定要存储的值”(5/4),则访问i并在没有插入序列点的情况下对其进行修改。
  • 正如Als所说,在实践中,如果每个人都有基本的常识不写,那么代码是否定义了行为并不重要; - )

答案 1 :(得分:0)

因为未在标准中定义后增量或分配将首先发生;由编译器实现来决定它们的顺序。

答案 2 :(得分:0)

在C ++中未定义为自身分配增量值:

i = i++

此后i应该是什么?它应该是前一个值还是一个加上前一个值?执行顺序留给编译器,因此不同的平台会有不同的结果。