包含前置增量和 post 增量的函数结果不同

Result of function that includes pre- and post-increment differs

我必须理解一些在函数中混合预增量和 post 增量的代码。有一件事让我很困惑。

所以我尝试测试一些较小的功能。但我无法解释以下行为:

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自己可以总结的比较好(我的加粗再次加粗):

The increment/decrement operators can be applied before (prefix) or after (postfix) the operand. The code result++; and ++result; will both end in result being incremented by one. The only difference is that the prefix version (++result) evaluates to the incremented value, whereas the postfix version (result++) evaluates to the original value. If you are just performing a simple increment/decrement, it doesn't really matter which version you choose. But if you use this operator in part of a larger expression, the one that you choose may make a significant difference.

来源here

在您的特定情况下,由于后缀的计算结果为原始值,并且同一算术运算符的运算顺序是从左到右 - 此处仅适用乘数 - 您的运算按上述方式转换。

Post-increment增加i的值但不会立即赋值i.

的新值

预增量增加i的值,并立即赋予新值

因此,在您的 y 示例中,在 i++

之后

i 已变为 2,但它仍然保持 1 的先前值。

++i发生时,值为2的i会增加1,同时赋值3。因此,1 * 3 * 2 为我们提供 6 的值 y

x

也一样

++x发生时,x立即被赋予2的新值。

然而,当x++发生时,x增加了1 但是仍然被分配了之前的值2。因此,2 * 2 * 2 给我们 8.