如果給您兩個獨立的完整C語句:i++;和i = i + 1;,則這兩個語句對程式的效果相同。兩者都會將的值加1 i。

因此,如果您看到一個獨立的i = i + 1;或i++甚至++i;,這三個都具有相同的效果。

但是這三個卻都略有不同。

如果僅將這些視為產生值的表示式,則可以從這三個表示式中得到兩種獨特的行為:

表示式i++增加i,但返回的前一個值i。

表示式++i遞增i,並返回賦值後的新值 i

表示式i = i + 1將1加到i,將其寫入i,然後返回賦值後的新值,就像。i ++i

“賦值後”位很有趣。事實證明,大多數整數計算最終都提升為C的int型別。但是,++i和i = i + 1似乎都截斷為的型別i。程式碼如下:

C語言中的i ++和i = i + 1有什麼區別?

輸出:

C語言中的i ++和i = i + 1有什麼區別?

因此,實際上,i=i+1看起來更像++i而不是i++

那麼,在令牌級別中,特別是在宏的上下文中呢?假設現在您處於一個完全不同的領域。該++運算子具有很高的優先順序,而=運算子優先順序較低。

假設您有以下程式碼:

C語言中的i ++和i = i + 1有什麼區別?

您可能會猜到,bad1和bad2以不同的方式進行擴充套件,並獲得完全不同的結果。

它們如何擴充套件:

C語言中的i ++和i = i + 1有什麼區別?

在這種bad1情況下,我覺得這bad1有點奇怪,只是不會呼叫未定義的行為。

在這種bad2情況下,我認為在右側的最終評估與左側的最終賦值之間沒有序列點i。那將帶您進入未定義的行為領域。

最終,兩者在實踐上並沒有太大區別。您只需要使用對您而言最易讀的內容,或者如果您有一套編碼準則,則只要在有意義的地方都遵守即可。

領取學習資料,以及進行學習交流,您可以看下圖:

C語言中的i ++和i = i + 1有什麼區別?