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

zig*_*ggy 24 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] ] );   
}
Run Code Online (Sandbox Code Playgroud)

我以为会是2.即,表达式评估为:

a[(a=b)[3]]
a[b[3]]    //because a is now pointing to b
a[0]   
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Mar*_*tos 26

每个运算符的参数从左到右进行计算.即,a在前面的[...]它的内容之前进行评价时,在该点它仍然是指所述第一阵列.


Miq*_*uel 16

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

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

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


Wan*_*gge 7

a [ (a = b)[3] ] )
Run Code Online (Sandbox Code Playgroud)

解释如下:

a = b => a = {2, 3, 1, 0};
( a = b )[3] => 0;
Run Code Online (Sandbox Code Playgroud)

这里有一个技巧:a评估为之前的值b被分配给它.

a[(a = b)[3]) => a[0] = 1;
Run Code Online (Sandbox Code Playgroud)

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