[英]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)
d的值遞增(d = 2)。
然后,在右側,讀取d的值(2)
最后,將d(3)的值放入加法函數中
因此1 + 3導致4
編輯:抱歉格式,我很擅長使用列表哈哈
關鍵是從操作返回的內容。
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
+
。
++
的前綴和后綴形式之間的不同優先級只能在++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.