为什么以下给定表达调用不确定的行为?

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

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

有帮助吗?

解决方案

它不是不确定的。

在这里回答C, 序列和部分顺序

我认为在C ++中也适用(这是我在看到该链接之前的回答):

逗号运算符引入一个序列(并在一定程度上约束必须评估表达式的顺序 - 左之前),因此::

  • 两个修改 i 由序列(第二个逗号)分开。
  • 修改 ii++ 通过序列点与其他所有内容分开。
  • 修改 i 经过 =不是 从最后一次发生 i 在表达中,但这没关系,因为我们可以访问 i 如果访问是“确定要存储的值”(5/4),则在没有中间序列的情况下修改它。
  • 正如ALS所说,在实践中,该代码是否已定义行为并不重要,因为每个人都有基本的常识不写它;-)

其他提示

因为未在标准中定义了插入后的哪个或任务将首先进行;它留给编译器实施来决定其订单。

它在C ++中不确定,无法为其分配增量值:

i = i++

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top