簡體   English   中英

Java中帶前增后減的表達式的值

[英]Value of expression with pre-increment and post-decrement in Java

考慮以下表達式:

int x = 5, y = 5, z;
z = y + x * y-- + ++x;

根據我的計算,考慮到++--優先級高於+ , z 的值應該是 40 。

所以z = 4 + 6 * 5 + 6 = 40

運行代碼產生z = 36的結果。 Java 是如何得出這個結果的?
另外,結合性(從右到左)在這里扮演什么角色?

你必須從左到右解釋它,所以:

所以z = y(5) + x(5) * y--(still 5, since the decrement will apply afterwards) + ++x(which is 6 because the increment applies before the evaluation of x)

結果是36

運算符優先級告訴您如何解析表達式。 它沒有告訴您任何有關評估順序的信息

有兩種方式來看待這個,你可以把它看成隱式大括號,或者看成 AST 的樣子。

如果你通過使用大括號的 PoV 來查看它,你最終會得到這個:

    z = y + x * y-- + ++x;
<=> z = y + (x * (y--)) + (++x);
<=> z = 5 + (5 * 5) + 6 // y-- is still 5 (4 afterwards), ++x is 6
<=> z = 5 + 25 + 6
<=> z = 36

如果你通過 AST 鏡頭看它,你會得到

  +
 / \
y   +
   / \
  *   x++
 / \
x   y--

現在,如果您按評估順序(從左到右)查看該 AST,您會看到最左邊的 y 仍然是 5。在右邊的樹上,我們再次有一個 +,它是乘法和 ++x 的結果。 乘法是 5 * 5,因為此時 y-- 仍然是 5,之后 y 是 4。 最后,++x 是 6,之后 x 是 6。 加在一起,5 + 25 + 6 = 36。

AST 總是按順序計算,運算符優先級告訴您 AST 的樣子(底部的強綁定運算符,頂部的弱綁定運算符)。

int x = 5, y = 5, z;
z = y + x * y-- + ++x;

在這個例子中var--var++z之后執行。 並且--var++varz之前執行。 在你的情況下

z = 5 + 5 * 5 + 6 = 36

如果您將表達式重寫為z = y + x * --y + ++x它將是z = 5 + 5 * 4 + 6 = 40

如果您將表達式重寫為z = y + x * y-- + x++ ,它將是z = 5 + 5 * 5 + 5 = 35

暫無
暫無

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

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