簡體   English   中英

如何用優先表證明 C 后綴增量運算符?

[英]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 ++然后賦值= 因此變量ab都應該等於 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 = ++aa更新前b 同樣,評估順序可能類似於

b <- a + 1
a <- a + 1

實際的評估順序取決於您的編譯器、優化設置,甚至是周圍的代碼。

強制從左到右計算表達式的唯一運算符是&&|| , ?:和逗號運算符。

優先級發生在解析過程中。 這意味着++適用於a ,而不適用於b = a

++手段遞增,經過這么執行a被評估為被分配給b

如果您希望兩者都取值2執行預增量:

b = ++a;

暫無
暫無

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

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