2016-07-21 84 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;' –