【问题标题】: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

      【讨论】:

        猜你喜欢
        • 2014-07-18
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2021-07-09
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多