考虑Java中的以下表达式。
int[] x={1, 2, 3, 4};
int[] y={5, 6, 7, 0};
x=y;
System.out.println(x[0]);
在控制台上显示5
,因为x
通过表达式y
指向x=y
,x[0]
显然会被评估为{{} 1}}实际上是5
的值。
当我用以下语句将上述两个语句替换为单个语句时,
y[0]
它显示System.out.println(x[(x=y)[3]]);
这是1
的值,即使它看起来与上述两个语句相同。怎么样?
答案 0 :(得分:6)
数组y中的第三个索引指向0,因此1是正确的输出。
所以你有
x[(x=y)[3]]
,x[y[3]]
,但y[3]
为0,因为数组为0索引,x[0]
为1。
答案 1 :(得分:2)
这是因为x = y
在索引中产生了新的x。现在x[3] = y[3] = 0
和x[0] = 1
,因为它仍然使用外部的旧x
数组。
答案 2 :(得分:1)
Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。
...println(x[y[3]]); // 1
答案 3 :(得分:1)
x[(x=y)[3]]
分解为
int[] z = y; // new "temp" array (x=y) in your expression above
int i = z[3]; // index 3 in y is 0
System.out.println(x[i]); // prints x[0] based on the value of i...which is 1
答案 4 :(得分:0)
这是所有优先事项
让我们看看这个
我们有以下表达式
x = 2 + 5 * 10
因此,在运行about表达式时,首先将其乘以5 * 10,然后将其与2相加,然后将其分配给x,因为“ =”的优先级最小
x [(x = y)[3]] 在这种情况下,最令人困惑的是那个(x = y)项,并且大多数程序员认为,它首先将y的引用分配给x,然后继续其余部分,但是 这里的赋值运算符最少解析
这就是为什么当您运行上述表达式后尝试打印x [0]时,由于y的第零个索引包含5,所以我将给出值5