[英]How following code compiles in C/C++?
以下代碼顯示為-10
int x = 10;
-x;
cout << -x << endl; // printf("%d\n", -x);
都在C和C ++編譯器(gcc 4.1.2)
。 我期待第二行出現編譯器錯誤。 可能是基本情況,但我不了解該行為。 有人可以解釋一下嗎?
謝謝
語句可以是表達式。 此類語句丟棄表達式的結果,並評估表達式的副作用。
-x;
計算x
的負數並丟棄結果。
有關更多信息,請閱讀C ++標准中的[stmt.expr]
。
當你做-x;
operator -
在變量上執行。
運算符返回否定值,但不更改對象本身。
因此,由於您不存儲運算符的結果,因此x
本身仍具有相同的值。
當將-x
打印到cout
,您會看到operator -
的結果operator -
返回到operator <<
C ++沒有賦值語句或過程調用語句。 它將賦值定義為表達式中的運算符,但有副作用,並具有表達式語句。 期望表達式語句中的頂級運算符具有副作用-它要么像賦值運算符一樣修改狀態,要么調用函數。 但是語言不是必需的,並且沒有任何副作用的表達式語句是完全合法的。
在這種情況下,好的編譯器會輸出警告,因為這幾乎肯定是程序員錯誤(而且您通常可以通過將結果顯式轉換為void
來關閉警告,如果出於某些原因您想要這樣的語句,則assert
宏通常會這個)。
第二行對x
無效,但可以計算。 第三對x
沒有影響,但是計算的輸出被發送到標准輸出std::cout
。 為了使事情更容易理解:
int x=10;
std::cout << x-10 << std::endl;
std::cout << x << std::endl;
將輸出0和10 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.