Java 包含前增量和后增量的函数的结果不同

Java 包含前增量和后增量的函数的结果不同,java,post-increment,pre-increment,Java,Post Increment,Pre Increment,我必须理解一些在函数中混合了前置和后置增量的代码。有一件事让我困惑 所以我试着测试一些较小的函数。但我无法解释以下行为: int i = 1; i = i++ * ++i * 2; System.out.println("i = " + i); int x = 1; x = ++x * x++ * 2; System.out.println("x = " + x); 预期产出为: i = 8 x = 8 但实际上是: i = 6 x = 8 有人能告诉我为什么吗? i++*++i*

我必须理解一些在函数中混合了前置和后置增量的代码。有一件事让我困惑

所以我试着测试一些较小的函数。但我无法解释以下行为:

int i = 1;
i = i++ * ++i * 2;
System.out.println("i = " + i);
int x = 1;
x = ++x * x++ * 2;
System.out.println("x = " + x);
预期产出为:

 i = 8
 x = 8
但实际上是:

 i = 6
 x = 8
有人能告诉我为什么吗?

  • i++*++i*2
    -->1*3*2-->6
  • ++x*x++*2
    -->2*2*2-->8
以粗体显示的重要值

在Java中返回值时,前缀和后缀增量之间的差异可以由Oracle自己更好地总结(为了突出显示,请再次使用mybold):

递增/递减运算符可以应用于操作数之前(前缀)或之后(后缀)。代码结果为++;和++结果;结果都将增加1唯一的区别是前缀版本(++result)的计算结果为递增值,而后缀版本(result++)的计算结果为原始值。如果您只是执行一个简单的递增/递减操作,那么选择哪个版本并不重要。但是,如果在较大表达式的一部分中使用此运算符,则选择的运算符可能会产生显著的差异

来源


在您的特定情况下,由于后缀计算为原始值,并且同一算术运算符的运算顺序为从左到右-此处仅应用乘法器-您的运算将按上述方式进行转换

增量后增加
i
的值,但不会立即分配
i
的新值

预增量增加
i
的值,并立即分配新值

因此,在y的示例中,在
i++
之后

i
已变为
2
,但它仍保留以前的值
1

当出现
++i
时,值为2的
i
将增加
1
,同时,分配新值
3
。因此,
1*3*2
为我们提供了
y
的值
6

这同样适用于
x

当出现
++x
时,
x
立即被分配新值
2

但是,当出现
x++
时,x会增加
1
,但
2
的前一个值仍会被赋值。因此,
2*2*2
为我们提供了
8