[英]How does Java process the expression x = x - (x = x - 1)?
我剛剛測試了以下代碼:
int x = 90;
x = x - (x = x - 1);
System.out.print(x);
它打印1。
據我了解,事情按以下順序排列:
x - 1
並將其存儲到存儲器中的臨時變量。 x
從項目1的臨時變量中分配結果。 x - the new value of x
計算x - the new value of x
。 x
; 我不明白為什么從中減去項目2的結果的x
在第2項之后仍然具有初始值。我缺少什么?
來自https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
除了賦值運算符之外的所有二元運算符都是從左到右計算的; 賦值運算符從右到左進行計算。
你正在做90 - (90 - 1)
=> 1
重要的是不要將優先級與評估順序混淆。 它們有關但不一樣。
編輯
正如@ruakh指出的那樣,JLS規范對上面的教程有所不同。
http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15 .7。
在評估右側操作數的任何部分之前,似乎完全評估了二元運算符的左側操作數。
如果運算符是復合賦值運算符(第15.26.2節),則對左側操作數的計算包括記住左側操作數表示的變量並獲取並保存該變量的值以用於隱含的二進制操作。
如果對二元運算符的左側操作數的求值突然完成,則右側操作數的任何部分似乎都沒有被評估。
它不是說從右到左評估賦值,而是將賦值視為首先要更新的變量的存儲,然后是值的評估,最后是賦值。
我們從:
int x = 90;
x = x - (x = x - 1);
第一個賦值運算符=具有低優先級,因此首先計算右側。
x = x - (x = x - 1)的右邊是x - b,其中b是(x = x - 1)
這個右側從左到右進行評估,因此它變為90-b
然后評估b,即(x = x-1)。 賦值運算符再次具有最低優先級,因此它變為(x = 90 - 1)或(x = 89)
替換回來,我們有90 - (x = 89),它是90 - 89,這是1.最后,第一個賦值運算符被計算,x變為1.你會注意到另一個賦值運算符(x = 89)沒有對整體運作有影響。
int x = 90;
x = x - (x = x - 1);
System.out.print(x);`
Here
x = 90 Goes in two section in your code.
First x=90 - , Second (x=90-1);
Then x=90 - , x = 89
Then x= 90 - 89
System.out.Print(x);
that is x=1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.