C 序列点

在连续的“序列点”之间,仅能通过表达式修改一次对象的值。 C 语言定义以下序列点:

  • 逻辑“与”运算符 (&&) 的左操作数。 完全计算逻辑“与”运算符的左操作数,并在继续之前完成所有副作用。 如果左操作数的计算结果为 false (0),则不计算另一个操作数。

  • 逻辑“或”运算符 (||) 的左操作数。 完全计算逻辑“或”运算符的左操作数,并在继续之前完成所有副作用。 如果左操作数的计算结果为 true(非零),则不计算另一个操作数。

  • 逗号运算符的左操作数。 完全计算逗号运算符的左操作数,并在继续之前完成所有副作用。 始终计算逗号运算符的两个操作数。 请注意,函数调用中的逗号运算符不保证计算顺序。

  • 函数调用运算符。 计算函数的所有参数,并在输入函数前完成所有副作用。 未指定参数之间的计算顺序。

  • 条件运算符的第一个操作数。 完全计算条件运算符的第一个操作数,并在继续之前完成所有副作用。

  • 完全初始化表达式的末尾(即,不是一个表达式的一部分的另一个表达式,如声明语句中的初始化的末尾)。

  • 表达式语句中的表达式。 表达式语句由可选表达式后跟分号 (; ) 组成。 为其副作用计算该表达式,并且此计算后面有一个序列点。

  • 选择语句(ifswitch)中的控制表达式。 完全计算该表达式,并在执行依赖于选择的代码之前完成所有副作用。

  • whiledo 语句的控制表达式。 在执行 whiledo 循环的下一个迭代中的任何语句前,完全计算表达式,并且完成所有副作用。

  • for 语句的所有三个表达式。 在执行 for 循环的下一个迭代中的任何语句前,完全计算表达式,并且完成所有副作用。

  • return 语句中的表达式。 完全计算该表达式,并在控制返回调用函数之前完成所有副作用。

请参阅

表达式计算