4
#include <iostream> 

int a(int &x) { 
    x = -1; 
    return x; 
} 

int main() { 
    int x = 5; 
    std::cout << a(x) << " " << x << std::endl; 
} 

爲什麼輸出是「-1 5」?C++中std :: cout的奇怪行爲

PS:編譯器是:

的i686-蘋果darwin11-LLVM-G ++ - 4.2(GCC)4.2.1(基於蘋果公司建立5658)(LLVM建立2336.11.00)

PS:編譯沒有任何優化。

+0

這些標準術語是功能副作用 – fayyazkl

回答

14

在這一行:未指定

std::cout << a(x) << " " << x << std::endl; 

a(x)x評價的順序。這是沒有說明的行爲會發生什麼,在你的情況下,編譯器決定先評估x,然後評估a(x)

+4

它是*未定義的行爲*?我認爲這是*未指定的行爲*。 – Nawaz

+0

@Nawaz Hm,可能是未指定的行爲(§1.3.15)我認爲。編輯。 –

+0

這在我看來很奇怪,因爲函數已經工作了。我希望內存中單元格的值可以改變。也許有人可以解釋我如何在asm代碼中翻譯? –

3

的順序,其中a(x)x正在評估是未指定[1]。爲了確保x會不一樣的表達中被修改(並通過這樣做,避免不確定的行爲),你可以這樣做:

int x = 5; 
int y = a(x); 
std::cout << y << " " << x << std::endl; 

[1] 「除非另有說明,評價的順序個體經營者和單個表達式的子表達式,並且其中的副作用發生的順序的操作數,是未指定「。5表達式,§4

+2

我認爲它是*未指定*,而不是*未定義*。 – Nawaz

+0

@Nawaz:你是對的:) – LihO

1

評估順序未確定,因此可以先評估0​​或者a(x)x。關於C++ draft standard部分1.9程序執行款說(重點煤礦):

[...] 除非另有說明,個體經營者的操作數和各個子表達式的評估表達式不確定。 [注意:在一個程序執行過程中多次評估的表達式中,對其子表達式的無序和不定序評估不需要在不同的評估中一致地執行。末端注] [...]

,它甚至可以在不同的評價和furthmore之間的差異,如果我們去回款它說:

[...] 如果A在B和B未在A之前測序之前未被測序,則A和B未測序。 [注意:不確定評估的執行可能會重疊。結束註釋]評估A和B是不確定的測序當A在B或B之前測序之前在A之前測序,但是未指定哪個。[...]

這說明這是未指定的行爲。