data [i ++] = data [i ++]*2结果让我感到惊讶

reg*_*all 2 javascript java

我只是声明数据数组

data = {0, 1, 2, 3, 4},  i = 1;  
data[i++] = data[i++] * 2;
Run Code Online (Sandbox Code Playgroud)

我在Java和Javascript中测试,结果都是

{0, 4, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)

一开始我觉得这对我来说太奇怪了

data[i++] * 2, data[1] * 2 = 2,
Run Code Online (Sandbox Code Playgroud)

然后i变成2,然后data[2] = 2i3.所以结果应该是{0, 1, 2, 3, 4}.

有人能知道这个结果的原因吗?

Daw*_*ica 7

来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.1中的Java语言规范

如果左侧操作数是一个数组访问表达式(第15.13节),可能包含在一对或多对括号中,则:

  • 首先,评估左侧操作数数组访问表达式的数组引用子表达式.如果此评估突然完成,则赋值表达式出于同样的原因突然完成; 不评估索引子表达式(左侧操作数数组访问表达式)和右侧操作数,也不进行赋值.

  • 否则,将评估左侧操作数数组访问表达式的索引子表达式.如果此评估突然完成,则赋值表达式会出于同样的原因突然完成,并且不会评估右侧操作数并且不会进行赋值.

  • 否则,将评估右侧操作数.如果此评估突然完成,则赋值表达式会出于同样的原因突然完成,并且不会发生任何分配.

换句话说,必须在右侧之前评估左侧的数组索引,以符合Java语言规范.

这意味着您将分配到data[1],并且您分配的值将是data[2] * 2.

如果你问的Javascript不过,我可以建议是使用Javascript的制造商想使结果从Java结果相匹配.