考虑代码:
#include<iostream>
using namespace std;
int refcube(double &ra)
{
ra*=ra*ra;
return ra;
}
int main()
{
auto x=2.0;
cout<<"cube of "<<x<<" is "<<refcube(x)<<endl;
return 0;
}
输出是:
cube of 8 is 8
为什么第一个x
的值显示为8
而不是2
?
最佳答案
因为未指定评估顺序。
编译器可能会生成调用refcube(x)
的代码,并在生成代码之前或之后计算其值,以获得x
的值,输出到std::cout
。
您的编译器选择编译此 C++ 代码时先调用 refcube(x)
,然后计算 x
。
C++ 语言规范在“排序”主题上花费了相当多的篇幅,它(非常笼统地说)指定了求值顺序。长话短说,在此示例中,x
未根据 refcube(x)
排序,在生成输出到 std 的表达式中: :cout
,这样的编译器可以自由地先编译表达式的任何一部分。
关于c++ - 在 C++ 中使用按引用传递的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38493609/