Jag*_*gan 29 c sequence-points
命令式编程中的序列点定义了计算机程序执行中的任何点,在该点处保证先前评估的所有副作用都已执行,并且尚未执行后续评估的副作用.
这是什么意思?有人可以用简单的语言解释一下吗?
pax*_*blo 42
当序列点出现时,它基本上意味着您可以保证所有先前的操作都已完成.
在没有插入序列点的情况下更改变量两次是未定义行为的一个示例.
例如,i = i++;
未定义,因为两个更改之间没有序列点i
.
维基百科有一个C和C++标准中的序列点列表,尽管最终列表应始终取自ISO标准.来自C99附录C:
以下是5.1.2.3中描述的序列点:
C11改变了措辞.它似乎打破了三元运算符并添加了一些更多细节:
以下是5.1.2.3中描述的序列点:
sup*_*cat 10
需要注意顺序点的一个重要的事情是,他们不是全球性的,而应该被视为一组局部约束.例如,在声明中
a = f1(x++) + f2(y++);
有x的计算++和呼叫于f1,和y的评价++和呼叫到f2之间另一序列点之间的序列点.有,但是,不能保证是否x将之前或F2被称为后递增,也不确定y会前或x称为后递增.如果f1改变y或f2改变x,则结果将是未定义的(编译器生成的代码例如读取x和y,递增x,调用f1,检查y与先前读取的值,以及 - 如果它改变了 - 继续横冲直撞寻找并摧毁所有Barney的视频和商品;我认为任何真正的编译器都不会产生实际上会这样做的代码,唉,但它会被允许在标准之下).
用一个例子扩展 paxdiablo 的答案。
假设声明
x = i++ * ++j;
Run Code Online (Sandbox Code Playgroud)
存在三个副作用:将 的结果赋值i * (j+1)
给 x、i 加 1、j 加 1。副作用的应用顺序未指定;i 和 j 可以在评估后立即递增,或者直到两者都评估之后但在分配 x 之前才可以递增,或者它们可以在分配 x 之后才递增。
序列点是所有副作用均已应用的点(x、i 和 j 均已更新),无论它们应用的顺序如何。