为什么此示例中的输出 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 ?
提前致谢。
答案 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'
这是我的理解。如果错误请告诉我。
谢谢,