我只是声明数据数组
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] = 2和i成3.所以结果应该是{0, 1, 2, 3, 4}.
有人能知道这个结果的原因吗?
来自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结果相匹配.
| 归档时间: |
|
| 查看次数: |
368 次 |
| 最近记录: |