2012-11-10 94 views
0

這是Java代碼的片段。訪問數組中的元素

class Test{   
    public static void main(String[ ] args){ 
     int[] a = { 1, 2, 3, 4 };        
     int[] b = { 2, 3, 1, 0 };      
      System.out.println(a [ (a = b)[3] ]);   
      } 
} 

爲什麼打印1?這不是功課!我想了解Java。這與OCA Java 7考試有關。

+0

作業?你試過什麼了? –

+0

你剛剛回答你的第一個問題嗎? –

+0

我只是運行代碼並找出答案。 (或者如果你想仔細看一下調試器就行了。) – millimoose

回答

4

在你指的a[ ... ]的那一刻,a仍然指向第一個數組。當索引本身被評估時,ba的分配。所以在那一刻,a變成了b,其中第3項被取出,即0

這個0被用作之前已經找到的數組的索引。這是a指出的數組,雖然a本身同時發生了變化。因此,它打印1,即使您可能期望2

我認爲這就是這個例子試圖顯示的內容:數組引用已經被計算過,並且在索引評估期間修改數組變量後不會改變。

但我不會在生產代碼中使用這個'功能'。非常不清楚。

+0

也許這是爲SCJP考試或相關。 –

3
System.out.println(a [ (a = b)[3] ]); 

首先,a值進行評估({1, 2, 3, 4})。接下來,執行a = b;這將b的值分配給a,並且返回的值bb[3] = { 2, 3, 1, 0 }0,所以最終是{1,2,3,4}[b[3]] = {1,2,3,4}[0] = 1


看到這一點,考慮以下因素:

public static void main(String[] args) throws FileNotFoundException { 
    int[] a = { 1, 2, 3, 4 };    
    System.out.println(a() [ (a = b())[c()] ]); 
} 

public static int[] a() { 
    System.out.println('a'); 
    return new int[]{ 1, 2, 3, 4 }; 
} 

public static int[] b() { 
    System.out.println('b'); 
    return new int[]{ 2, 3, 1, 0 }; 
} 

public static int c() { 
    System.out.println('c'); 
    return 3; 
} 

輸出:

a 
b 
c 
1 
+0

根據教程,我指的是第一個左邊部分已經被執行,即a。然後只有[a] b [3]] – uml

+0

@uml確實,首先執行'a [x]',但是'x = b [3]',所以'a [b [3]]'是1. –

+0

這個答案是錯誤的。(a = b)不會先執行。如果是這樣,解決方案將是'2',而不是'1'。 – GolezTrol