Java中的数组表达式
考虑以下Java中的表达式Java中的数组表达式,java,Java,考虑以下Java中的表达式 int[] x={1, 2, 3, 4}; int[] y={5, 6, 7, 0}; x=y; System.out.println(x[0]); 将在控制台上显示5,因为x通过表达式x=y指向y,x[0]显然将计算为5,这实际上是y[0]的值 当我用下面的语句替换上面的两个语句时,将这两个语句组合成一个语句 System.out.println(x[(x=y)[3]]); 它显示1,这是x[0]的值,尽管它似乎与上述两条语句等效。如何操作?数组y中的第三个索
int[] x={1, 2, 3, 4};
int[] y={5, 6, 7, 0};
x=y;
System.out.println(x[0]);
将在控制台上显示5
,因为x
通过表达式x=y
指向y
,x[0]
显然将计算为5
,这实际上是y[0]
的值
当我用下面的语句替换上面的两个语句时,将这两个语句组合成一个语句
System.out.println(x[(x=y)[3]]);
它显示
1
,这是x[0]
的值,尽管它似乎与上述两条语句等效。如何操作?数组y中的第三个索引指向0,因此1是正确的输出
你有吗
x[(x=y)[3]]
这是
x[y[3]]
,但是y[3]
是0,因为数组是0索引的,x[0]
是1。这是因为x=y
在索引中生成新的x。所以现在x[3]=y[3]=0
和x[0]=1
,因为它仍然在外部使用旧的x
数组。Java编程语言保证操作符的操作数按照特定的求值顺序求值,即从左到右
...println(x[y[3]]); // 1
分解为
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
这都是关于优先权的问题 让我们看看这个 我们有下面的表达 x=2+5*10 因此,在运行about表达式时,它首先乘以5*10,然后将其与2相加,并将其分配给x,因为“=”的优先级最小 x[(x=y)[3]] 在这种情况下,最让人困惑的是(x=y)这个术语,大多数程序员认为它首先将y的引用分配给x,然后继续进行剩余部分,但是 这里的赋值运算符是最小的
这就是为什么在运行上述表达式后尝试打印x[0]时,我会给出值5,因为y的第0个索引包含5您不应该使用此类表达式。它们令人困惑,容易出错,很难调试。它们仍然存在,我们必须知道Java或任何语言中与这些东西相关的一切。
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