【问题标题】:How many times could a variable be incremented in a single statement?一个变量可以在单个语句中递增多少次?
【发布时间】:2019-12-21 10:21:35
【问题描述】:

我目前正在阅读 Barry Burd 的 Java For Dummies,偶然发现了这个小练习。

该练习是关于后增量和前增量的。在问题中(请参阅代码),除了最后一行之外,我能够找出所有行的答案(没有编译器的帮助)。根据我迄今为止对后期/预增量的了解,这没有意义。

请告知结果不符合我预期的方式或原因。

我尝试初始化并声明一个值为“20”的新变量 (int),然后执行“i = i++ + i++”,但仍然收到相同的结果 (41)。

还尝试了两次 out.println(i),但仍然打印 41。

import static java.lang.System.out;

public class Main
{
    public static void main(String[] args) {

        int i = 10;
        out.println(i++); //10(post11)
        out.println(--i); //10(pre11-1)

        --i; //9(pre10-1)
        i--; //9(post8)
        out.println(i); //8
        out.println(++i); //9(pre8+1)
        out.println(i--); //9(post8)
        out.println(i); //8
        i++; //8(post9)
        i = i++ + ++i; //i = 9(post10) + 10(pre9+1) = 19(post20)
        out.println(i);  //20
        i = i++ + i++; //i = 20(post21) + 20(post21) = 40(post42)
        out.println(i); //41 (result copied from compiler)  

    }
}

我希望最后一行打印 42 而不是 41,因为“20”被添加了两次,并且也被增加了两次。

【问题讨论】:

  • FWIW,我认为在同一语句中将后/前增量运算符与其他运算符(例如加法和赋值)结合起来是可恶的。

标签: java increment post-increment pre-increment


【解决方案1】:

您可以通过编写自己的打印例程来查看发生了什么。

      int i = 9;
      i = print(i++) + print(++i); // i = 9(post10) + 10(pre9+1) = 19(post20)
      System.out.println("\n" + i); // 20
      i = print(i++) + print(i++); // i = 20(post21) + 20(post21) = 40(post42)
      System.out.println("\n" + i); // 41 (result copied from compiler)

      public static int print(int i) {
          System.out.print(" i = " + i + " ");
          return i;
      }

【讨论】:

    【解决方案2】:

    当您使用赋值运算符 (=) 时,它在后自增运算符之后完成。这样你就得到了:

    int i = 10;
    i = i++;
    System.out.println(i); // print 10
    

    当你在同一行使用两次后自增时,不是在行完成后增加,而是在指令完成后增加(指令为i++)。因此,当做 i = i++ + i++;你实际上正在这样做:

    i = i++ + i++; // i=20 Original code
    i = 20 + i++;  // i=21 The first i++ return 20 then increment i to 21
    i = 20 + 21;   // i=22 The second i++ return 21 then increment i to 22
    i = 41;        // i=22 The addition is computed 
    41;            // i=41 and assigne to i
    

    这一切都与运算符优先级有关。

    【讨论】:

    • 非常感谢您回答这个问题,所以我的理解是,无论在同一行中使用多少次后增量,该值都会继续传递到下一个“i++”,本质上是第一个“i++”不会增加,因为传递在同一行中的最后一个操作之后结束。另外,请解释一下我变成“22”的部分。很抱歉给您带来不便。
    • i 在 i++ 返回其当前值后递增。因此,第一次在该行返回 20 并变为 21。第二次在该行返回 21 然后变为 22。之后计算加法 (20+21) 并分配给 I 成为 41。
    【解决方案3】:
    i = i++ + i++
    

    计算结果为(如果 i 为 20):

    i = 20 + 21
    

    因为第一个i++ 是一个post 操作符,所以不会影响它。不过确实会影响i的下次使用。

    我会逐步分解:

    i =i+++ i++;, i == 20

    i =20+ i++, i == 21

    i = 20 +i++i == 21

    i = 20 +21i == 22

    i =41

    【讨论】:

    • 您可能会考虑明确概述如何单独评估每个 i++(一个接一个)以产生“相同表达式”的两个不同值。
    • 非常感谢您抽出宝贵时间来回答这个问题,尽管它仍然令人费解,但它相对更有意义。我无法理解的部分是“i”如何变成“22”。
    • 当第二个后增量生效时,i 变为 22。
    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多