2013-10-07 107 views

回答

3

讓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) 
+0

我同意在第二種情況下x增加到23,但爲什麼它在第一種情況下不增加到66? – user1517393

+0

爲什麼呢? 21 + 22 + 22從未66.增量操作在x上運行,而不是在y上運行。 –

1

++ x是不同的X ++

之前在同一行做任何操作+ X x遞增。

在同一行中完成任何操作後,x ++增加x。

爲了計算到65,它必須進行如下計算。

(1 + 20)+(1 + 21)+(22)= 65

之後,X是23

0

我認爲Y =(++ 20)+(++ 21 )+ 22 = 21 + 22 = +22 65

0

首先,你應該明白這一點:

++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.

0

不對相同表達式中的同一個變量使用++和=,增量不會生效。從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

+0

優秀的建議,但不是問題的答案。 –

0

總體而言,這是不好的編程,絕對不應該在實際代碼中使用,因爲在所有前後增量中很容易迷路。

但這裏是基本的解釋。

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. 

這個故事告訴我們,永遠不要做這個和表達式並表達後評估後的增量發生前的預增量發生。