序列点
序列点(sequence point)是程序执行中的一个特殊点,在该点可以保证先前评估的所有副作用(side effect)都已执行,并且后续评估的副作用尚未执行。
如果标量对象的副作用相对于同一标量对象的不同副作用或者使用相同标量对象值的值计算是未排序的,则该行为是未定义的。如果表达式的子表达式有多个允许的排序,在任何排序中出现这种未排序的副作用,则行为是未定义的。
下列表达式的行为是未定义的。
i = ++i + 1; a[i++] = i;
下列表达式的行为是允许的。
i = i + 1; a[i] = i;
C语言中序列点会出现在以下位置:
1、函数调用时对函数指示符和实际参数的评估与函数实际调用之间。
2、在逻辑与运算符(&&)、逻辑或运算符(||)、逗号运算符(,)第一个操作数的评估和第二个操作数的评估之间。
3、在条件运算符(? :)第一个操作数的评估与第二个操作数、第三个操作数的评估之间。
4、在完整表达式的评估和下一个要评估的完整表达式之间。
(完整表达式包括:可变修改类型的完整声明符,不属于复合字面量的初始化式,表达式语句中的表达式,if或者switch选择语句中的控制表达式,while或者do语句中的控制表达式,for语句中的表达式,return语句中的表达式。)
5、库函数(例如:sqrt)返回前。
6、格式化输入输出函数(例如:printf、scanf)转换说明相关联的操作后。
7、每次调用比较函数(例如:bsearch、qsort中的比较函数。)前、每次调用比较函数后以及在比较函数的任何调用和作为参数传递给该调用的对象的任何移动之间。