[英]strange behavior of std::cout in c++
#include <iostream>
int a(int &x) {
x = -1;
return x;
}
int main () {
int x = 5;
std::cout << a(x) << " " << x << std::endl;
}
為什么輸出是“-1 5”?
PS:編譯器是:
i686-apple-darwin11-llvm-g ++ - 4.2(GCC)4.2.1(基於Apple Inc. build 5658)(LLVM build 2336.11.00)
PS:沒有任何優化編譯。
在這一行:
std::cout << a(x) << " " << x << std::endl;
未指定a(x)
和x
的評估順序。 這是未指定的行為,在您的情況下,編譯器決定先評估x
,然后再評估a(x)
。
正在評估a(x)
和x
的順序是未指定的 [1] 。 為了確保不會在同一個表達式中修改x
(並通過這樣做避免未指定的行為),您可以:
int x = 5;
int y = a(x);
std::cout << y << " " << x << std::endl;
[1] “除非另有說明,否則單個運算符的操作數和個別表達式的子表達式的評估順序以及副作用發生的順序是未指定的。” 5表達式,§4
評估順序是未排序的,因此它是未指定的行為,或者可以首先評估a(x)
或x
。 關於C ++草案標准第1.9
節程序執行第15段說( 強調我的 ):
[...] 除非另有說明,否則對個體操作員的操作數和個別表達式的子表達式的評估是不確定的 。 [注意:在程序執行期間不止一次評估的表達式中,不需要在不同的評估中一致地執行對其子表達式的未序列和不確定順序的評估。 - 注意事項] [...]
它甚至可能在不同的評估之間有所不同,如果我們回到第13段它會說:
[...] 如果A在B之前沒有排序,B在A之前沒有排序,那么A和B都沒有排序 。 [注意:未經測試的評估的執行可能會重疊。 -end note]評估A和B是不確定的順序,當A在B之前測序或B在B之前測序,但未指定哪個 。[...]
這解釋了這是未指明的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.