5

可能重复:
Java - 操作顺序 - 在一行中使用两个赋值运算符

如果我们在链中为变量赋值,如下所示,

int x=10, y=15;
int z=x=y;

System.out.println(x+" : "+y+" : "+z);

那么所有三个变量的值xyz变为15


但是,我不理解数组的以下现象。

int array[]={10, 20, 30, 40, 50};
int i = 4;

array[i] = i = 0;    
System.out.println(array[0]+" : "+array[1]+" : "+array[2]+" : "+array[3]+" : "+array[4]);

它输出10 : 20 : 30 : 40 : 0. array[4]它用替换最后一个元素的值0

关于之前的赋值语句 - int z=x=y;,我希望第一个元素的值意味着array[0]替换为0. 为什么不是这样?这很简单,但我无法弄清楚。你能解释一下吗?


顺便说一句,这个赋值语句array[i] = i = 0;是虚拟的,它在这段代码中没有自己的价值,不应该再使用,但我只是想知道在这种情况下事情是如何工作的。

4

4 回答 4

7

int i = 4;当 i 等于 4 时,array[i]等于array[4]soarray[i] = i = 0;等于array[4] = i = 0;. 这就是它将索引 4 的值更改为 0 的方式。

于 2012-10-29T06:31:36.617 回答
7

分隔符 [] 和 () 更改优先级。这些分隔符内的所有内容都将在 Java 向外查看之前进行计算。

array[i] = i = 0;

在编译器阶段,此行的第一次更改将发生如下:

array[4] = i = 0; // subscript separator is evaluated first.

现在,赋值操作是右关联的,因此,i被赋值0,然后 array[4] 被赋值为iie 0

检查以下链接:

于 2012-10-29T06:42:27.067 回答
3

让我打破它......

您的声明:

int array[]={10, 20, 30, 40, 50};

执行:

array[0] => 10

array[1] => 20

array[2] => 30

array[3] => 40

array[4] => 50

您的声明:

int i = 4;

执行:

i => 4

您的声明:

array[i] = i = 0;

执行:

array[4] = i = 0;

array[4] = 0

好吧,如果您愿意array[0] => 0,请执行此操作...

int i = 0;

array[i] = i = 0
于 2012-10-29T06:47:19.280 回答
2

因为array[i]在赋值操作之前被评估

于 2012-10-29T06:34:09.613 回答