Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java data[i+;+;]=data[i+;+;]*2结果令我惊讶_Java_Javascript - Fatal编程技术网

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