在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
是虚拟的,在这段代码中它没有自己的价值,不应该再被使用,但我只是想知道在这种情况下它实际上是如何工作的当i等于4时,array[i]
等于array[4]
soarray[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]
(可能是编译器进行的一些优化)。这是第一个也是正确的。为什么被否决?