簡體   English   中英

Java中的++和 - 運算符的優先級

[英]Precedence of ++ and — operators in Java

我從Java的官方教程中讀到前綴和后綴++ - 具有不同的優先級:

后綴:expr ++ expr--

一元:++ expr --expr + expr -expr~!

運營商

根據教程,不應該這樣

d = 1; System.out.println(d++ + ++d);

打印6( d++使d 2, ++d使它成為3)而不是4?

我知道預先評估++d的解釋,但如果d++優先級高於++d ,為什么不首先評估d++ 更重要的是,在什么情況下d++應該表明它具有更高的優先級?

編輯:

我嘗試了以下方法:

d = 1; System.out.println(++d * d++);

它返回4.它似乎應該是2 * 2,而不是1 * 3。

println語句的內部是這個操作(d ++)+(++ d)

  1. 如下,讀取d的值(d = 1)
  2. 將d(1)的當前值加入加法函數中
  3. d的值遞增(d = 2)。

  4. 然后,在右側,讀取d的值(2)

  5. d的值遞增(現在d = 3)
  6. 最后,將d(3)的值放入加法函數中

    因此1 + 3導致4

編輯:抱歉格式,我很擅長使用列表哈哈

關鍵是從操作返回的內容。

  • x ++更改x的值,但返回舊的x。
  • ++ x更改x的值,並返回新值。
d=1
System.out.println(d++ + ++d); // d is 1
System.out.println(1 + ++d); // d is 2
System.out.println(1 + 3); // d is 3

打印4

不同的優先權並不意味着將首先評估

這意味着表達式將以這種方式分組

在這種情況下, d++ + ++d將被分組(d++) + (++d) ,並且將按以下順序計算此二進制表達式:

  • 左操作數d++ 此子表達式由后綴增量運算符和變量組成,因此它具有以下兩種效果:
    • 子表達式的值為1
    • 變量更新: d = 2
  • 右操作數++d 此子表達式由前綴增量運算符和變量組成,因此它具有以下兩種效果:
    • 變量更新: d = 3
    • 子表達式的值為3
  • 使用兩個操作數的值評估operator +
    • 因此表達值為1 + 3 = 4。

++的前綴和后綴形式之間的不同優先級只能在++d++看到,它將被解釋為++(d++) - 這沒有任何意義( (++d)++沒有任何一個,或者),因為++只適用於變量,而不適用於值(結果是值)。

這不是關於優先權,而是關於評估順序。 d++計算結果為1 ,但隨后d遞增。 ++d遞增d ,然后計算結果為3。

請參閱此處為何忽略此Java運算符優先級?

歸結為后綴運算符首先被計算,但返回變量的原始值 ,如設計的那樣。 因此,出於您的操作目的:

(d++ + ++d)

Processes as:
1. d++ evaluates, returning the original value of 1 but incrementing d to 2
2. ++d evaluates, incrementing the value of 2 TO 3, and returning 3
3. +   evaluates, resulting in 1 + 3

對於要評估的令牌,混淆不是優先順序,你已經做到了。 真正的問題在於理解后綴和前綴運算符之間的功能差異。

我經歷了從頂部的所有解釋..根據理解下面的代碼應該給11.0然后y它給10.0倍x = 4.5; x = x + ++ x; // x得到值10.0。

d的值為1

d ++被評估; 它的值是1,d現在是2(后++在增量前返回值)

++ d被評估; 它的值是3,d現在是3(增量后的++預返回值)

1 + 3 = 4

System.out.println(d ++ + ++ d);

這是怎么回事:

++ d被執行,所以d現在是2。

執行d + d,等於4。

值4被賦予System.out.println()

d ++被執行,所以現在d是3。

這是一個常見的錯誤。 即使在oracle認證指南中,他們也說Post增量和減量運算符的優先級高於Pre運算符。

我相信這是一個許多人已經存在一段時間的錯誤。 在嘗試了幾個表達式之后。 我相信我可以自信地說前置和后置運算符具有相同的優先級,並且從左到右進行評估。

您可以通過評估以下示例進行實驗,以便自己確認。

int y = 4;
int x = --y * 2 + 3 + y-- * 2;      // x is 15

int y = 4;
int x = --y * 2 + 3 + y++ * 2;      // x is 15

除了其他評論之外,我建議你看看序列點,因為這些東西中的一些可能導致未定義的行為,盡管我認為你的案例是為java定義的。

什么是x[i]=i++ + 1; 做?

http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html

暫無
暫無

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

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