[英]How to justify C postfix increment operator with precedence table?
我正在使用 C 運算符優先級表來更好地理解 C 的運算符優先級。我在理解以下代碼的結果時遇到問題:
int a, b;
a = 1;
b = a++; // does not seem to follow C operator precedence
使用 C 運算符的優先級表,我無法解釋為什么使用后綴++
運算符,首先評估賦值然后遞增。
后綴遞增運算符 ( ++
) 在 C 中具有最高優先級,而賦值運算符 ( =
) 具有最低優先級。 所以在上面的代碼中,必須先執行 postfix ++
然后賦值=
。 因此變量a
和b
都應該等於 2 但它們不是。
為什么 C 運算符優先級似乎不適用於此代碼?
postfix ++
的最高優先級什么時候不顯示?
這與優先級無關。 這是后綴++
運算符如何工作的問題。
后綴++
運算符計算其操作數的當前值,並具有增加其操作數的副作用。 相反,前綴++
運算符的計算結果為其操作數的遞增值。
int a, b;
a = 1;
b = a++; // b is 1, a is 2
b = ++a; // b is 3, a is 3
后綴++
運算符的這種行為記錄在C 標准的第 6.5.2.4p2 節中:
后綴
++
運算符的結果是操作數的值。 作為副作用,操作數對象的值會增加(即,將適當類型的值 1 添加到其中)。 有關約束、類型和轉換以及操作對指針的影響的信息,請參閱加法運算符和復合賦值的討論。 結果的值計算在更新操作數的存儲值的副作用之前排序。 對於不確定順序的函數調用,后綴++
的操作是單個評估。 具有原子類型的對象上的 Postfix++
是具有 memory_order_seq_cst 內存順序語義的讀-修改-寫操作。
前綴++
運算符記錄在第 6.5.3.1p2 節中:
前綴
++
運算符的操作數的值遞增。 結果是遞增后操作數的新值。 表達式++E
等價於(E+=1)
。 有關約束、類型、副作用和轉換以及操作對指針的影響的信息,請參閱加法運算符和復合賦值的討論。
優先級僅確定在解析期間哪些運算符與哪些操作數分組。 它不控制評估的順序。 ++
具有比=
更高的優先級僅意味着b = a++
被解析為b = (a++)
而不是(b = a)++
。
++
運算符(一元和后綴形式)具有結果和副作用。 在表達式b = a++
,結果a++
是的當前值a
-這就是被分配給b
。 a++
的副作用是將 1 添加到a
。
在其中分配的順序b
和更新到a
發生是不確定的。 最直接的就是
b <- a
a <- a + 1
但也允許以下內容:
tmp <- a
a <- a + 1
b <- tmp
的結果++a
是的當前值a
加1,並且副作用是1添加到a
。 不要假設在像表達式b = ++a
那a
更新前b
。 同樣,評估順序可能類似於
b <- a + 1
a <- a + 1
實際的評估順序取決於您的編譯器、優化設置,甚至是周圍的代碼。
強制從左到右計算表達式的唯一運算符是&&
、 ||
, ?:
和逗號運算符。
優先級發生在解析過程中。 這意味着++
適用於a
,而不適用於b = a
。
但++
手段交遞增,經過這么執行a
被評估為被分配給b
如果您希望兩者都取值2
執行預增量:
b = ++a;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.