在C ++中使用传递引用时出现意外输出

时间:2016-07-21 01:54:15

标签: c++ pass-by-reference

考虑代码:

#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

1 个答案:

答案 0 :(得分:3)

因为未指定评估顺序。

编译器可以生成代码以调用refcube(x)并在生成代码之前或之后计算其值以获得x的值,以便输出到std::cout

您的编译器首先选择将此C ++代码编译为调用refcube(x),然后评估x

C ++语言规范在“排序”主题上花费了不少页面,其中(非常松散地说)指定了评估顺序。长话短说,在这个例子中,x没有按照refcube(x)的顺序排序,在生成std::cout的输出的表达式中,这样的编译器可以自由编译首先是表达式的任何一部分。