以下表达式的行为是否定义良好?

时间:2012-09-01 06:58:12

标签: c sequence-points c89

Cosider序列指向以下表达式

i = (++i,i++,i);

如果我是正确的,执行步骤如下:

1)

++i, i++

2)

step1,i

3)

i = step2

对于步骤1中的评估,i的值应仅修改一次,以使构造被定义为已定义(因为在评估逗号运算符之后存在序列点)。但我认为这不是这种情况。因此它应该是未定义的。 请参阅此answer。这里,上述表达被称为定义。我错过了什么吗?

1 个答案:

答案 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)。