命令式编程中的序列点定义了计算机程序执行中的任何点,在该点处保证先前评估的所有副作用都已执行,并且尚未执行后续评估的任何副作用。
这是什么意思?有人可以用简单的话解释一下吗?
当序列点发生时,基本上意味着您可以保证之前的所有操作都已完成。
在没有插入序列点的情况下两次更改变量是未定义行为的一个示例。
例如,i = i++;
未定义,因为两次更改之间没有序列点i
.
请注意,这不仅仅是changing一个变量两次可能会导致问题。这实际上是与任何其他用途相关的更改。该标准使用术语“值计算and当讨论事物如何排序时,副作用”。例如,在表达式中a = i + i++
, the i
(值计算)和i++
(副作用)可以按任意顺序进行。
维基百科有一个序列点列表 http://en.wikipedia.org/wiki/Sequence_point尽管最终列表应始终取自 ISO 标准,但 C 和 C++ 标准中都有。来自 C11 附录 C(释义):
以下是标准中描述的顺序点:
- 在函数调用和实际调用中对函数指示符和实际参数的求值之间;
- 在运算符的第一个和第二个操作数的计算之间
&&
, ||
, and ,
;
- 在条件的第一个操作数的计算之间
?:
运算符以及第二个和第三个操作数中的任何一个被评估;
- 完整声明符的结尾;
- Between the evaluation of a full expression and the next full expression to be evaluated. The following are full expressions:
- 初始化器;
- 表达式语句中的表达式;
- 选择语句的控制表达式 (
if
or switch
);
- a 的控制表达
while
或做声明;
- a 的每个表达式
for
陈述;
- return 语句中的表达式。
- 紧接着库函数返回之前;
- 在与每个格式化输入/输出函数转换说明符相关的操作之后;
- 每次调用比较函数之前和之后,以及对比较函数的任何调用和作为参数传递给该调用的对象的任何移动之间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)