簡體   English   中英

以下代碼如何在C / C ++中編譯?

[英]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; 

將輸出010

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM