最近,对于一些疯狂但在语法上允许的代码语句(例如i = ++i + 1
和i=(i,i++,i)+1;
),我看到了很多关于输出的问题。
坦白地说,几乎没有人会在实际编程中编写任何这样的代码。坦率地说,我在专业经验中从未遇到过这样的代码。因此,我通常最终会在SO上跳过此类问题。但是最近被问到这样的Q的庞大数量使我思考是否通过跳过这样的Q来漏掉一些重要的理论。我发现这样的Q围绕Sequence points
。我几乎不知道有关序列点的任何信息,我只是想知道是否不知道它在某种程度上是一个障碍。所以有人可以解释Sequence points
的理论/概念,或者如果可能的话,指向解释该概念的资源。另外,值得花时间去了解这个概念/理论吗?
最佳答案
我能想到的最简单的答案是:
C++是根据抽象机定义的。仅根据执行“副作用”的顺序来定义在抽象机上执行的程序的输出。副作用定义为对IO库函数的调用,以及对标记为volatile的变量的更改。
允许C++编译器在内部执行他们想做的任何事情来优化代码,但是它们不能更改对 volatile 变量和io调用的写入顺序。
顺序点定义c/c++程序的心跳-顺序点之前的副作用是“完整的”,而顺序点之后的副作用尚未发生。但是,副作用(或可以间接影响副作用的代码(可以在序列点内重新排序)。
这就是为什么理解它们很重要的原因。没有这种了解,您对c++程序的基本理解(以及如何通过积极的编译器对其进行优化)是有缺陷的。
关于c++ - 关于序列点的说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4105036/