Java data[i+;+;]=data[i+;+;]*2结果令我惊讶
我只是声明数据数组Java data[i+;+;]=data[i+;+;]*2结果令我惊讶,java,javascript,Java,Javascript,我只是声明数据数组 data = {0, 1, 2, 3, 4}, i = 1; data[i++] = data[i++] * 2; 我用Java和Javascript进行测试,结果都是 {0, 4, 2, 3, 4} 一开始我觉得这对我来说太奇怪了 data[i++] * 2, data[1] * 2 = 2, 然后i变成2,然后数据[2]=2和i变成3。所以结果应该是{0,1,2,3,4} 有人知道这个结果的原因吗?它是一个自动递增,后递增(即使用变量的当前值,但使用后,其值会
data = {0, 1, 2, 3, 4}, i = 1;
data[i++] = data[i++] * 2;
我用Java和Javascript进行测试,结果都是
{0, 4, 2, 3, 4}
一开始我觉得这对我来说太奇怪了
data[i++] * 2, data[1] * 2 = 2,
然后i
变成2
,然后数据[2]=2
和i
变成3
。所以结果应该是{0,1,2,3,4}
有人知道这个结果的原因吗?它是一个自动递增,后递增(即使用变量的当前值,但使用后,其值会自动递增,以便下次使用)
在第一个data[i++]
中,它使用i的值(即1),然后将其增加,因此在第二个data[i++]
i是2
因此,方程变成了
data[1]=data[2]*2
希望它有意义
data[i++] = data[i++] * 2;
步骤1:-
data[i++] -> data[1]//because i is under post increment
步骤2:-
data[i++] * 2->data[2]*2-> 2*2 ->4 // now i is 2
步骤3:-
data[1] = 4;//interpreter interprets left to right
在Java语言中,一种形式为
a[x]=y代码>是。也就是说,x
在y
之前计算。这个
此外,在使用is后,增量后运算符x++
会更改x
的值
将这两个事实与一个直观的解释结合起来(如下),这一切都应该是有意义的:
i = 1;
data[i++] = data[i++] * 2;
^ ^
| |
1 2
System.out.println(i); // would display '3'
这很简单。。。(后增量完成了这一任务)
右手侧的i++值更改为2,因为它在左手侧已后加
data[i++]=data[i++]*2
其扩展如下:
data[1]=data[2]*2
data[1]=2*2;
因此
data=[0,4,2,3,4]
来自Java语言规范
如果左侧操作数是数组访问表达式(§15.13),
可能包含在一对或多对括号中,然后:
- 首先,左边操作数的数组引用子表达式
对数组访问表达式进行求值。如果此评估完成
突然,则赋值表达式为
同样的理由;左操作数数组的索引子表达式
访问表达式)和右侧操作数不求值,且没有
分配发生
- 否则,左侧操作数数组的索引子表达式
对访问表达式进行求值。如果此评估突然完成,
然后赋值表达式出于同样的原因突然完成
并且不会对右侧操作数求值,也不会进行赋值
- 否则,将计算右侧操作数。如果这个评估
突然完成,然后赋值表达式突然完成
出于同样的原因,并且没有分配发生
换句话说,左侧的数组索引必须在右侧之前求值,以符合Java语言规范
这意味着您将分配到数据[1]
,分配的值将是数据[2]*2
如果你问的是Javascript,我能建议的就是Javascript的制造商想要让结果与Java的结果相匹配。Javascript
++运算符递增变量,然后返回(计算为)原始值
一个简单的例子是:
var x = 0;
console.log(x + (x++) + x) // 1
第一个和第二个x的值为0,而第三个x的值为1(因为它已递增)正如其他人所说:
数据[1]=数据[2]*2,一旦该表达式被处理,i==3。然而,这意味着我们接下来得到的是数据[3]=数据[4]*2,应该是16。因此,您的输出没有意义。我删除了您的和标记,因为它们看起来不相关。如果你的问题实际上是关于这些语言中的一种,请在你的问题中解释原因。我的预期结果是{0,1,2,3,4},而不是{0,4,2,3,4}。这个问题帮助其他人以不同的方式思考。。但是你的期望值不清楚,对不起,你确定你的期望结果是{0,1,2,3,4}吗?这不是输入吗?我只是想写:)所以基本上他应该做:data[I++]=data[I]*2代码>我知道自动递增,后递增,我不知道为什么它从左到右求值。很好的一点,数组索引一个左手边必须在右手边之前求值。很好地发现了真正的混淆源-求值顺序。虽然您的答案对JavaScript引用有点轻描淡写。是的,但实际上,您问了两个问题——“为什么Java中会出现这种情况”和“为什么JavaScript中会出现这种情况”。我只知道其中一个问题的答案。也许Javascript专家可以回答第二个问题。对不起,我的意思是“OP问了两个问题”,而不是你@Duncan。
var x = 0;
console.log(x + (x++) + x) // 1