2016-07-21 50 views
0

参考意外的输出考虑代码:使用通通过在C++

#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

这里的一些答案http://stackoverflow.com/questions/14809978/order-of-execution-in-operator – SnoozeTime

回答

3

因为未指定评估订单。

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

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

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

+0

如何指定评估顺序呢?任何相同代码的简单例子? – robstat7

+2

将它分解为两个单独的语句:'cout <<“cube of << <<; cout <<“是”<< refcube(x)<< endl;' –