Java数组 - 为什么输出'1'?

时间:2011-12-04 11:25:39

标签: java arrays scjp ocpjp

为什么此示例中的输出 1

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] ] );   
}

我认为这将是 2 。即表达式评估为:

a[(a=b)[3]]
a[b[3]]    //because a is now pointing to b
a[0]   

不应该[0] 2 ,因为 a 指向 b

提前致谢。

4 个答案:

答案 0 :(得分:26)

从左到右评估每个运算符的参数。即,a前面的[...]在其内容之前被评估,此时它仍然引用第一个数组。

答案 1 :(得分:16)

这也是我的意思......但是,请查看第15.7.1节here

基本上,操作数从左到右进行评估。但也请注意:

  

建议代码不要严格依赖此规范。当每个表达式最多包含一个副作用时,代码通常更清晰,作为其最外层的操作,并且当代码不依赖于由于从左到右的表达式评估而出现哪个异常时,代码就更清晰了。

答案 2 :(得分:7)

a [ (a = b)[3] ] )

解释如下:

a = b => a = {2, 3, 1, 0};
( a = b )[3] => 0;

以下是诀窍:a被评估为b分配给它之前的值。

a[(a = b)[3]) => a[0] = 1;

考虑Java中的运算符优先级。它应该更明显一点。

答案 3 :(得分:2)

正如Marcelo Cantos先生指出的那样,每个操作员的论据都是从左到右进行评估。因此,我认为执行是

a[(a=b)[3]]

这里的外部' a'将获取" 1,2,3,4"然后评估它的论证(a = b)[3]。因此现在a = b并且返回b数组中索引3处的元素,其也由a。

指向

因此我们得到了一个' 0'从论证评价。如前所述,外部a仍指旧内容因此在1,2,3,4数组中给出[0]。

因此我们得到了' 1'

这是我的理解。如果错误请告诉我。

谢谢,