Cosider序列指向以下表达式
i = (++i,i++,i);
如果我是正确的,执行步骤如下:
1)
++i, i++
2)
step1,i
3)
i = step2
对于步骤1中的评估,i的值应仅修改一次,以使构造被定义为已定义(因为在评估逗号运算符之后存在序列点)。但我认为这不是这种情况。因此它应该是未定义的。 请参阅此answer。这里,上述表达被称为定义。我错过了什么吗?
答案 0 :(得分:4)
以下指令的行为定义明确。
i = (++i, i++, i);
在逗号运算符(,
)的第一个和第二个操作数的求值之间确实存在一个序列点。该标准的附录C虽然提供了信息,但提供了序列点的描述。
C11,附件C序列点
以下是5.1.2.3中描述的序列点:
- 在功能指示符和实际的评估之间 函数调用中的参数和实际调用。 (6.5.2.2)。
- 在以下运算符的第一个和第二个操作数的计算之间:逻辑AND&& (6.5.13);逻辑OR || (6.5.14); 逗号,(6.5.17)。
- 在第一个操作数的评估之间 有条件的? :运算符,以及第二个和第三个中的任何一个 评估操作数(6.5.15)。 - 完整声明者的结尾: 宣告者(6.7.6);
- 评估完整表达式和下一个完整表达式之间 要评估的表达式。以下是完整的表达式: 初始值不是复合文字的一部分(6.7.9);该 表达式中的表达式(6.8.3);控制 表达选择语句(if或switch)(6.8.4);该 控制while或do语句的表达式(6.8.5);每一个 (可选)for语句的表达式(6.8.5.3); (可选) 表达式在return语句中(6.8.6.4)。
- 在库函数返回之前(7.1.4)。 - 之后 与每个格式化输入/输出功能相关的操作 转换说明符(7.21.6,7.29.2)。
- 在每次调用之前和之后立即进行比较 函数,以及任何对比较函数和任何调用之间的函数 作为参数传递给该调用的对象的移动(7.22.5)。