在Java中为链中的变量赋值

在Java中为链中的变量赋值,java,arrays,variable-assignment,Java,Arrays,Variable Assignment,可能重复: 如果我们在一个链中为一个变量赋值,如下所示 int x=10, y=15; int z=x=y; System.out.println(x+" : "+y+" : "+z); 然后,所有三个变量x、y和z的值变为15 但是,我不理解数组中的以下现象 int array[]={10, 20, 30, 40, 50}; int i = 4; array[i] = i = 0; System.out.println(array[0]+" : "+array[1]+" :

可能重复:

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

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

System.out.println(x+" : "+y+" : "+z);
然后,所有三个变量
x
y
z
的值变为
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
。它用
0
替换最后一个元素
array[4]
的值

关于先前的赋值语句-
intz=x=y
,我希望第一个元素的值表示
数组[0]
将替换为
0
。为什么不是这样?这很简单,但我搞不懂。你能解释一下吗



顺便说一下,这个赋值语句
array[i]=i=0
是虚拟的,在这段代码中它没有自己的价值,不应该再被使用,但我只是想知道在这种情况下它实际上是如何工作的array[i]等于
array[4]
so
array[i]=i=0
相当于
数组[4]=i=0。这就是它将索引4的值更改为0的方式。

因为
数组[i]
是在赋值操作开始之前计算的分隔符[]和()更改优先级。这些分隔符中的所有内容都将在Java查看它们之前进行计算。

array[i] = i = 0;
在编译器阶段,此行的第一次更改将如下所示:

array[4] = i = 0; // subscript separator is evaluated first.
现在,赋值操作是右关联的,因此,
i
被赋值为
0
,然后数组[4]被赋值为
i
,即
0

查看以下链接:

    • 让我来打破它

      您的声明:

      array[0] => 10
      
      array[1] => 20
      
      array[2] => 30
      
      array[3] => 40
      
      array[4] => 50
      
      i => 4
      
      array[4] = i = 0;
      
      array[4] = 0
      
      int数组[]={10,20,30,40,50}

      实施:

      array[0] => 10
      
      array[1] => 20
      
      array[2] => 30
      
      array[3] => 40
      
      array[4] => 50
      
      i => 4
      
      array[4] = i = 0;
      
      array[4] = 0
      
      您的声明:

      array[0] => 10
      
      array[1] => 20
      
      array[2] => 30
      
      array[3] => 40
      
      array[4] => 50
      
      i => 4
      
      array[4] = i = 0;
      
      array[4] = 0
      
      inti=4

      实施:

      array[0] => 10
      
      array[1] => 20
      
      array[2] => 30
      
      array[3] => 40
      
      array[4] => 50
      
      i => 4
      
      array[4] = i = 0;
      
      array[4] = 0
      
      您的声明:

      array[0] => 10
      
      array[1] => 20
      
      array[2] => 30
      
      array[3] => 40
      
      array[4] => 50
      
      i => 4
      
      array[4] = i = 0;
      
      array[4] = 0
      
      array[i]=i=0

      实施:

      array[0] => 10
      
      array[1] => 20
      
      array[2] => 30
      
      array[3] => 40
      
      array[4] => 50
      
      i => 4
      
      array[4] = i = 0;
      
      array[4] = 0
      
      如果您想要
      数组[0]=>0
      ,那么请执行以下操作

      int i = 0;
      
      array[i] = i = 0
      

      请看,我认为
      array[I]
      在编译时本身被评估为
      array[4]
      (可能是编译器进行的一些优化)。这是第一个也是正确的。为什么被否决?