序列点在c

A sequence point in imperative programming defines any point in a computer program’s execution at which it is guaranteed that all side effects of previous evaluations will have been performed, and no side effects from subsequent evaluations have yet been performed.

这是什么意思?有人可以用简单的话说明吗?

当发生序列点时,它基本上意味着您保证所有以前的操作都已完成。

更改变量两次而没有中间的序列点是未定义行为的一个示例。

例如,i = i;是未定义的,因为我的两个变化之间没有序列点。

维基百科在C和C标准中有list of the sequence points,尽管最终列表应始终取自ISO标准。从C99附录C:

以下是5.1.2.3中描述的序列点:

>调用函数之后,对参数进行评估(6.5.2.2)。
>以下运算符的第一个操作数的结尾:逻辑与&& (6.5.13);
逻辑OR || (6.5.14);有条件的(6.5.15); (6.5.17)。
>完整声明者的结尾:声明者(6.7.5);
>完整表达式的结束:初始化器(6.7.8);表达式中的表达式
声明(6.8.3);选择语句(if或switch)的控制表达式
(6.8.4);控制表达的while或do语句(6.8.5);每一个
表达式(6.8.5.3);表达式在return语句中
(6.8.6.4)。
>在库函数返回之前(7.1.4)。
>与每个格式的输入/输出功能转换相关联的动作
说明符(7.19.6,7.24.2)。
>在每次调用比较功能之前和之后立即和之前
在任何调用比较功能和对象的任何移动之间也是如此
作为参数传递给该通话(7.20.5)。

C11的措辞改变了。似乎已经打破了三元运算符,并增加了一些更多的细节:

以下是5.1.2.3中描述的序列点:

函数中的函数指示符和实际参数之间的关系
通话和实际通话。 (6.5.2.2)。
>在以下运算符的第一和第二操作数的评估之间:
逻辑与&& (6.5.13);逻辑OR || (6.5.14); (6.5.17)。
在条件?:运算符和第一个操作数的第一个操作数的评估之间
对第二和第三操作数进行评估(6.5.15)。
>完整声明者的结尾:声明者(6.7.6);
在评估一个完整的表达和下一个完整的表达式之间
评估。以下是完整的表达式:初始化器(6.7.9);表达在
表达声明(6.8.3);选择语句的控制表达式
(如果或切换)(6.8.4);控制表达的while或do语句
(6.8.5);每个表达式的for语句(6.8.5.3);表达在a
回报表(6.8.6.4)。
>在库函数返回之前(7.1.4)。
>与每个格式的输入/输出功能转换相关联的动作
说明符(7.21.6,7.28.2)。
>在每次调用比较功能之前和之后立即和之前
在任何调用比较功能和对象的任何移动之间也是如此
作为参数传递给该调用(7.22.5)。

http://stackoverflow.com/questions/3575350/sequence-points-in-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:序列点在c