考虑代码:
#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
?
答案 0 :(得分:3)
因为未指定评估顺序。
编译器可以生成代码以调用refcube(x)
并在生成代码之前或之后计算其值以获得x
的值,以便输出到std::cout
。
您的编译器首先选择将此C ++代码编译为调用refcube(x)
,然后评估x
。
C ++语言规范在“排序”主题上花费了不少页面,其中(非常松散地说)指定了评估顺序。长话短说,在这个例子中,x
没有按照refcube(x)
的顺序排序,在生成std::cout
的输出的表达式中,这样的编译器可以自由编译首先是表达式的任何一部分。