java数据[i++]=data[i++]*2结果令我惊讶
我只是声明数据数组
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
,然后data[2] = 2
和i
变成3
。所以结果应该是{0, 1, 2, 3, 4}
有人知道这个结果的原因吗
# 1 楼答案
这很简单。。。(增加后就可以了)
右手侧的i++值更改为2,因为左手侧的后增量
其扩展如下:
因此
# 2 楼答案
Javascript
++运算符递增变量,然后返回(计算)原始值
一个简单的例子是:
第一个和第二个x的值为0,而第三个x的值为1(因为它已递增)
# 3 楼答案
在Java中,
a[x] = y;
形式的赋值是evaluated left-to-right。也就是说,x
在y
之前进行求值。这个same is true for JavaScript此外,在使用is之后,增量后运算符
x++
会更改x
的值将这两个事实与视觉解释结合起来(见下文),这一切都应该是有意义的:
# 4 楼答案
希望它有意义
第一步:
第二步:
第三步:
# 5 楼答案
来自Java语言规范http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.1
换句话说,左侧的数组索引必须在右侧之前求值,以符合Java语言规范
这意味着您将分配到
data[1]
,分配的值将是data[2] * 2
但是,如果你问的是Javascript,我只能建议Javascript的制造商希望让结果与Java的结果相匹配
# 6 楼答案
它是一个自动递增,后递增(即使用变量的当前值,但使用后,其值会自动递增,以便下次使用)
在第一个
data[i++]
中,它使用i的值(即1),然后将其增加,因此在第二个data[i++]
中,i是2因此方程变成
data[1]=data[2]*2