在连续的“序列点”之间,仅能通过表达式修改一次对象的值。 C 语言定义以下序列点:
逻辑“与”运算符 (&&) 的左操作数。 完全计算逻辑“与”运算符的左操作数,并在继续之前完成所有副作用。 如果左操作数的计算结果为 false (0),则不计算另一个操作数。
逻辑“或”运算符 (||) 的左操作数。 完全计算逻辑“或”运算符的左操作数,并在继续之前完成所有副作用。 如果左操作数的计算结果为 true(非零),则不计算另一个操作数。
逗号运算符的左操作数。 完全计算逗号运算符的左操作数,并在继续之前完成所有副作用。 始终计算逗号运算符的两个操作数。 请注意,函数调用中的逗号运算符不保证计算顺序。
函数调用运算符。 计算函数的所有参数,并在输入函数前完成所有副作用。 未指定参数之间的计算顺序。
条件运算符的第一个操作数。 完全计算条件运算符的第一个操作数,并在继续之前完成所有副作用。
完全初始化表达式的末尾(即,不是一个表达式的一部分的另一个表达式,如声明语句中的初始化的末尾)。
表达式语句中的表达式。 表达式语句由可选表达式后跟分号 (;) 组成。 为其副作用计算该表达式,并且此计算后面有一个序列点。
选择(if 或 switch)语句中的控制表达式。 完全计算该表达式,并在执行依赖于选择的代码之前完成所有副作用。
while 或 do 语句的控制表达式。 完全计算该表达式,并且在执行 while 或 do 循环的下一次迭代中的任何语句执行之前完成所有副作用。
for 语句的所有三个表达式。 完全计算这些表达式,并在执行 for 循环的下一次迭代中的任何语句之前完成所有副作用。
return 语句中的表达式。 完全计算该表达式,并在控制返回调用函数之前完成所有副作用。