考虑下面的代码:
int i = 1;
int x = ++i + ++i;
对于编译器可能为此代码执行的操作,我们有一些猜测,假设它进行编译。
++i
都返回 2
,导致 x=4
。++i
返回 2
,另一个返回 3
,结果是 x=5
。++i
都返回 3
,导致 x=6
。在我看来,第二种可能性最大。使用 i = 1
执行两个 ++
操作符之一,i
递增,并返回结果 2
。然后使用 i = 2
执行第二个 ++
操作符,i
递增,并返回结果 3
。然后将 2
和 3
加在一起得到 i = 1
0。
但是,我在 VisualStudio 中运行此代码,结果是 6
。我试图更好地理解编译器,我想知道什么可能导致 6
的结果。我唯一的猜测是,代码可以通过某种“内置”并发执行。调用了两个 ++
操作符,每个操作符在返回另一个操作符之前递增 i
,然后它们都返回 3
。这将与我对调用堆栈的理解相矛盾,需要进行解释。
一个 C++
编译器可以做哪些(合理的)事情来导致 4
或者结果或者 6
的结果?
这个例子出现在未定义行为比雅尼·斯特劳斯特鲁普的《编程: 使用 c + + (c + + 14)的原则与实践》中。
参见 肉桂的评论。