我是介绍 C++ 课程的助教。上周在一次测试中提出了以下问题:
以下程序的输出是什么:
int myFunc(int &x) {
int temp = x * x * x;
x += 1;
return temp;
}
int main() {
int x = 2;
cout << myFunc(x) << endl << myFunc(x) << endl << myFunc(x) << endl;
}
对我和我所有的同事来说,答案显然是:
8
27
64
但现在有几个学生指出,当他们在某些环境中运行它时,他们实际上得到了相反的结果:
64
27
8
当我使用 gcc 在我的 linux 环境中运行它时,我得到了我所期望的。在我的 Windows 机器上使用 MinGW 我明白他们在说什么。它似乎首先评估对 myFunc 的最后一次调用,然后是第二次调用,然后是第一次调用,然后一旦获得所有结果,它就会以正常顺序输出它们,从第一个开始。但是因为电话是乱序的,所以数字是相反的。
在我看来是编译器优化,选择以相反的顺序评估函数调用,但我真的不知道为什么。我的问题是:我的假设是否正确?这就是在后台发生的事情吗?或者有什么完全不同的东西?另外,我真的不明白为什么向后评估函数然后向前评估输出会有好处。由于 ostream 的工作方式,输出必须向前,但似乎对函数的评估也应该向前。
谢谢你的帮助!