這是可能的,因爲後增量操作符應該將x增加到66?x = 20; x = ++ x + ++ x + x ++; java中x的最終值是65
當我對y = ++ x ++ ++ x + x ++;它給出了y值爲65和x爲23。
因此,讓我知道java編譯器如何解決這些表達式。
這是可能的,因爲後增量操作符應該將x增加到66?x = 20; x = ++ x + ++ x + x ++; java中x的最終值是65
當我對y = ++ x ++ ++ x + x ++;它給出了y值爲65和x爲23。
因此,讓我知道java編譯器如何解決這些表達式。
讓Java給你看。 javap -c MyClass
顯示你的字節碼:
public static void main(java.lang.String[]);
Code:
0: bipush 20
2: istore_1
3: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
6: iinc 1, 1
9: iload_1
10: iinc 1, 1
13: iload_1
14: iadd
15: iload_1
16: iinc 1, 1
19: iadd
20: dup
21: istore_1
22: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
25: return
如果你想想看,結果是完全合乎邏輯的:你有兩個preincrements和一個後置。所以,你的代碼實際上是:
y = 0
x++ // 21
y += x
x++ // 22
y += x
y += x // (still 22!)
x++ // 23
x = y // (21 + 22 + 22 at this point)
我同意在第二種情況下x增加到23,但爲什麼它在第一種情況下不增加到66? – user1517393
爲什麼呢? 21 + 22 + 22從未66.增量操作在x上運行,而不是在y上運行。 –
++ x是不同的X ++
之前在同一行做任何操作+ X x遞增。
在同一行中完成任何操作後,x ++增加x。
爲了計算到65,它必須進行如下計算。
(1 + 20)+(1 + 21)+(22)= 65
之後,X是23
我認爲Y =(++ 20)+(++ 21 )+ 22 = 21 + 22 = +22 65
首先,你應該明白這一點:
++i
增量i
並返回i
。
i++
返回i
然後增加它。
現在我們已經確定了這一點,讓我們來分解程序。
在程序開始時,x = 20
。因此,++x
將返回21.現在,當您再次以此方式增加x
時,您將遞增而不是。因此,++x
+ ++x
將評估爲21 + 22
,其等於43.在此程序中,x
等於22
。因此,如果您將x++
添加到43,則會將值x
添加到43,然後只增加x
。這最終導致y
的值爲65,並且x
的值爲23.
不對相同表達式中的同一個變量使用++和=,增量不會生效。從Java™謎題:陷阱,陷阱和角例約書亞·布洛克,尼爾Gafter 拼圖#25:
作爲拼圖的標題所暗示的,問題在於,做增量聲明:
j = j ++;
據推測,該聲明的作者意在爲其添加1到 的j值,這就是表達式j ++所做的。不幸的是,作者無意中將這個表達式的值賦給了j。 當放置在變量之後時,++運算符作爲後綴 遞增運算符[JLS 15.14.2]:表達式j ++的值是 ,它是j的原始值在遞增前的值。因此, 前面的分配首先保存j的值,然後將j設置爲其值012加1,最後將j重置爲其原始值。在 中換句話說,賦值就相當於這個序列的 語句:
int tmp = j;
j = j + 1;
j = tmp;
,結果你的母鹿看起來是這樣的,當它評估:
int x=20
int sum;
x=x+1; //x=20=1
sum=x; //sum and x equal 21
x=x+1; //x=22
sum=sum+x; //sum=43
sum= sum+x; //sum=65
x= x+1; //x=23
x=sum; //x=65;
這就是X = 65,而不是66
優秀的建議,但不是問題的答案。 –
因此,讓我知道Java的編譯器是如何解決這些表達。
Java編譯器只是簡單地實現了Java語言規範。
如果你真的需要了解編譯器如何評估可怕和怪異之類的語句,你需要了解規範的相關部分:
等等。
總體而言,這是不好的編程,絕對不應該在實際代碼中使用,因爲在所有前後增量中很容易迷路。
但這裏是基本的解釋。
simple enough:
x = 20
Here is where it gets messy:
y = ++(20) + ++(++(20)) + (++(++(20)))++
Pre increment --> ++x
Post increment --> x++
Pre increments happen inside the evaluation and post
increments happen after the evaluation.
So that statement can be reduced in the following steps.
y = 21 + ++(21) + (++(21))++
y = 21 + 22 + (22)++
y = 21 + 22 + 22
y = 65
After all these increments x = 23. In the statement above though, x equals multiple
numbers because of all the pre and post increments.
這個故事告訴我們,永遠不要做這個和表達式並表達後評估後的增量發生前的預增量發生。
你應該記住這一點C Operator Precedence
所以後增量先行++X = 20
然後x++=22
然後 x++ = 23
所以總65.
'Y = 21 + 22 + 22'? – Blender
後增量具有最高優先級,然後預增。 – santhosh