2012-10-29 70 views
4

可能重複:
Java - Order of Operations - Using Two Assignment Operators in a Single Line在Java技術鏈賦值給變量

如果我們分配一個變量類似下面的鏈中的價值,

int x=10, y=15; 
int z=x=y; 

System.out.println(x+" : "+y+" : "+z); 

那麼所有三個變量的值x,yz變成15。我不明白以下現象與數組。

int array[]={10, 20, 30, 40, 50}; 
int i = 4; 

array[i] = i = 0;  
System.out.println(array[0]+" : "+array[1]+" : "+array[2]+" : "+array[3]+" : "+array[4]); 

它輸出10 : 20 : 30 : 40 : 0。它將array[4]中的最後一個元素的值替換爲0

關於以前的轉讓聲明 - int z=x=y;,我預計第一個元素的值意味着array[0]將被替換爲0。爲什麼不是這樣?這很簡單,但我無法弄清楚。你能解釋一下嗎?


順便說一句,這個賦值語句array[i] = i = 0;是假的,它有沒有自己的價值在這段代碼,不應再使用,但我只是想知道事情如何實際工作在這種情況下。

+1

見http://stackoverflow.com/questions/9440844/java-order-of-operations-using-two-assignment-operators-in - 單行 – Mikhail

+0

我認爲'array [i]'在編譯時本身被評估爲'array [4]'(可能是由Compiler完成的一些優化)。 –

回答

6

int i = 4;當我等於4時array[i]等於array[4]所以array[i] = i = 0;等於array[4] = i = 0;。也就是說方式,改變索引4的值與0

+2

這是第一個也是正確的。爲什麼它低調? – Lion

2

因爲array[i]被分配opeartion

4

隔板[]和()改變優先級之前進行評價。在Java看起來在它們之外之前,這些分隔符中的所有內容都將被計算。

array[i] = i = 0; 

在編譯階段,第一階段變化到這條線會發生如下:

array[4] = i = 0; // subscript separator is evaluated first. 

現在,分配操作是右結合的,所以,i被分配值0然後陣列[ 4]分配的值爲i,即0

檢查以下鏈接:

3

讓我打破它....

你聲明:

int array[]={10, 20, 30, 40, 50};

實現:

array[0] => 10 

array[1] => 20 

array[2] => 30 

array[3] => 40 

array[4] => 50 

你聲明:

int i = 4;

實現:

i => 4 

你聲明:

array[i] = i = 0;

實現:

array[4] = i = 0; 

array[4] = 0 

那麼如果你想array[0] => 0,然後做到這一點...

int i = 0; 

array[i] = i = 0