最近,我看到很多关于一些疯狂但语法上允许的代码语句的输出的问题,例如i = ++i + 1
and i=(i,i++,i)+1;
。
坦率地说,现实中几乎没有人在实际编程中编写任何此类代码。坦白说,在我的专业经验中,我从未遇到过此类代码。所以我通常最终会跳过这样的问题。但最近被问到的此类问题的数量之多让我思考我是否因跳过此类问题而错过了一些重要的理论。我猜这样的问题围绕着Sequence points
。坦率地说,我对序列点几乎一无所知,我只是想知道不了解它是否会在某种程度上成为一种障碍。那么有人可以解释一下理论/概念吗Sequence points
,或者如果可能的话,指出解释该概念的资源。另外,是否值得投入时间来了解这个概念/理论?
我能想到的最简单的答案是:
C++ 是根据抽象机定义的。在抽象机上执行的程序的输出仅根据“副作用”执行的顺序来定义。副作用被定义为对 IO 库函数的调用,以及对标记为 volatile 的变量的更改。
C++ 编译器可以在内部做任何他们想做的事情来优化代码,但他们不能改变 volatile 变量和 io 调用的写入顺序。
序列点定义了c/c++程序的心跳——序列点之前的副作用是“完成”的,而序列点之后的副作用尚未发生。但是,副作用(或者,可以间接影响副作用的代码(within序列点可以重新排序。
这就是为什么理解它们很重要。如果没有这种理解,您对 C++ 程序是什么(以及如何通过积极的编译器对其进行优化)的基本理解就会有缺陷。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)