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