5

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

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

我的问题受这里Als 问题的影响

4

3 回答 3

11

它不是未定义的。

在这里回答了 C、序列点和偏序

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

逗号运算符引入了一个序列点(并在一定程度上限制了表达式必须被评估的顺序——从左到右),所以:

  • 的两个修改i由序列点(第二个逗号)分隔。
  • iin的修改i++通过序列点与其他所有内容分开。
  • iby=的修改没有与表达式中最后出现的 of 分开i,但这没关系,因为我们可以在i没有中间序列点的情况下访问和修改它,前提是访问是“确定要存储的值”( 5/4)。
  • 正如 Als 所说,在实践中,只要每个人都有基本的常识不写它,该代码是否定义了行为并不重要;-)
于 2010-11-05T11:46:50.323 回答
0

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

于 2010-11-05T11:46:19.257 回答
0

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

i = i++

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

于 2010-11-05T11:48:48.970 回答