簡體   English   中英

你如何評估 z = x- - == y + 1;

[英]How do you evaluate z = x- - == y + 1;

鑒於

int w = 1;
int x = 6;
int y = 5;
int z = 0;
 
z = !z || !x && !y;
printf("%d\n", z);

z = x-- == y + 1;
printf("%d\n", z);

如果 x-- 是 5 並且 y+1 是 6,有人可以解釋下面的行如何評估為 1 嗎?

z = x-- == y + 1;

表達式x--遞減之前計算為x的值。

所以x-- == y + 16 == 5 + 1相同,這是真的,然后將值 1 分配給z

表達方式

z = x-- == y + 1

將被解析為

z = ((x--) == (y + 1))

督察,你的結果比較x--到的結果, y + 1 ,然后將其賦值比較的結果z

的結果x--是的當前值x ; 副作用是x遞減。 所以,給定

x == 6
y == 5

然后

x--            == 6
y + 1          == 6
(x-- == y + 1) == 1

所以1被分配給z 在此評估之后, x將等於5

請注意,在這種情況下,C 不會強制從左到右求值 - y + 1可以在x--之前求x-- 另請注意,不必在評估后立即應用--運算符對x的副作用 - 整個事情可以評估為

t1 <- y + 1
t2 <- x
 z <- t2 == t1
 x <- x - 1

要么

t1 <- x
t2 <- y + 1
 x <- x - 1
 z <- t1 == t2

或任何其他訂單。 x的更新和對z的分配可以以任何順序發生,甚至同時發生(交錯或並行)。

雖然慣用的 C 通常有點令人頭疼,但這有點太過分了。 作為學習運算符優先級和副作用的學術練習,這很好(不是很好),但是任何在生產代碼中這樣做的人都可能會在代碼審查中對此感到悲傷。 如果沒有其他問題,它不能很好地掃描 - 只需添加一些括號(就像我上面所做的那樣)將極大地幫助提高可讀性。

來自 C 標准(6.5.2.4 后綴自增和自減運算符)

2 后綴++運算符的結果是操作數的值。 作為副作用,操作數對象的值會增加(即,將適當類型的值 1 添加到其中)。

3 后綴--運算符與后綴++運算符類似,只是操作數的值是遞減的(即減去相應類型的值1)

因此在這個表達式語句中

z = x-- == y + 1;

可以等效地重寫為

z = ( x-- ) == ( y + 1 );

后綴遞減表達式x--的值是遞減前變量x的值。 即表達式的值等於6

表達式y + 1值也等於6因為y的值等於5

最后(C 標准,6.5.9 相等運算符)

3 ==(等於)和 !=(不等於)運算符類似於關系運算符,只是它們的優先級較低。108)如果指定的關系為真,則每個運算符都產生 1,如果指定的關系為假,則產生 0。 結果的類型為 int。 對於任何一對操作數,只有一個關系為真

因此,當表達式x--的值等於表達式y + 1的值時,變量z的值為1

您可以通過以下方式獲得預期的結果保持后綴遞減運算符

z = ( x--, x == y + 1 );

通過插入逗號運算符。 在這種情況下,在逗號運算符之后有一個序列點,這意味着在逗號運算符的第二個操作數中x == y + 1 x將已經等於 5。

另一方面,如果你會寫這樣的表達式

z = --x == y + 1;

其中使用一元減量運算符代替后綴減量運算符——那么表達式 --x 的值將等於5 (一元減量運算符的值是其減量后的操作數的值)。 在這種情況下,變量 z 的值為0因為5不等於6 (表達式y + 1的值)。

暫無
暫無

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

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