【问题标题】:Result of function that includes pre- and post-increment differs包含前后增量的函数结果不同
【发布时间】:2019-12-10 02:31:27
【问题描述】:
我必须理解一些在函数中混合了前后增量的代码。有一件事让我很困惑。
所以我尝试测试一些较小的功能。但我无法解释以下行为:
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
谁能告诉我为什么?
【问题讨论】:
标签:
java
post-increment
pre-increment
【解决方案1】:
-
i++ * ++i * 2 --> 1 * 3 * 2 --> 6
-
++x * x++ * 2 --> 2 * 2 * 2 --> 8
粗体中的重要值。
在Java中返回值时前缀和后缀增量之间的区别可以由Oracle自己更好地总结(我的粗体再次用于突出显示):
递增/递减运算符可以在操作数之前(前缀)或之后(后缀)应用。代码结果++;和++结果;都将导致结果加一。 唯一的区别是前缀版本 (++result) 计算为递增值,而后缀版本 (result++) 计算为原始值。如果您只是执行简单的递增/递减,那么您选择哪个版本并不重要。但是,如果您在较大表达式的一部分中使用此运算符,您选择的那个可能会产生显着差异。
来源here。
在您的特定情况下,由于后缀计算为原始值,并且对于相同的算术运算符,运算顺序是从左到右的 - 此处仅适用乘数 - 您的运算按上述方式进行转换。
【解决方案2】:
后增量增加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。