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 考试有关。

4

2 回答 2

4

在您引用的那一刻a[ ... ]a仍然指向第一个数组。b当索引本身被评估时,有一个to的赋值a。所以在那一刻,a变为b,其中第三项被提取,即0

0用作之前已经找到的数组的索引。这是a指向的数组,虽然a同时它本身已经改变了。因此它会打印1,即使您可能期望2.

我认为这就是这个例子试图展示的内容:数组引用已经被评估,并且一旦你在评估索引期间修改数组变量就不会改变。

但我不会在生产代码中使用这个“功能”。很不清楚。

于 2012-11-10T16:31:43.127 回答
3
System.out.println( a [ (a = b)[3] ] );

首先,a评估 的值 ( {1, 2, 3, 4})。接下来,a = b被执行;这将 的值分配ba返回的值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
于 2012-11-10T16:24:23.287 回答