代码之家  ›  专栏  ›  技术社区  ›  caisil

Java中等式“i++i”的计算顺序是什么?

  •  1
  • caisil  · 技术社区  · 7 年前

    考虑一下这个片段:

    int a = 1, b = 1, c = 1;
    System.out.println(a + ++a);
    System.out.println(b++ + ++b);
    System.out.println(c++ + c);
    

    3
    4
    3
    

    这就是我认为正在发生的事情,但输出不匹配:

    1. ++a -> +a -> 4 = 2 + 2
    2. ++b -> +b -> 4 = 2 + 2
    3. c -> +c -> 2 = 1 + 1
    
    3 回复  |  直到 7 年前
        1
  •  8
  •   Andrew Li    7 年前

    1. b = 1 , b 初始化为1。
    2. b++ , 公式中的当前值为1, 然后 b 是递增的 .
    3. ++b , 由于后增量而增加,所以它是2。现在由于前增量而再次增加,方程中的值是3。
    4. 1 + 3 是4。

    递增变量,然后返回它 因此在 ++1 ,值递增,然后返回,并计算为2。使用后增量, 1++

    1. b++ + ++b
      ^^^
      post-increment, evaluates to 1
      
    2. 1 + ++b
          ^^^
          pre-increment, due to post-increment is 2, then pre-increments and evaluates to 3
      
    3. 1 + 3
      ^^^^^
      evaluates to 4
      

    a + ++a , ++a a 计算,此时为1,然后

    1. a + ++a
      ^
      nothing, evaluates to 1
      
    2. 1 + ++a
          ^^^
          pre-increment, evaluates to 2
      
    3. 1 + 2
      ^^^^^
      evaluates to 3
      

    在第三个例子中, c++ + c , c 然后为2,如下所示:

    1. c++ + c
      ^^^
      post-increment, evaluates to 1
      
    2. 1 + c
          ^
          nothing, due to post-increment is 2 and evaluates to 2
      
    3. 1 + 2
      ^^^^^
      计算结果为3
      

    3
    4
    3
    

    应该注意的是,优先级并不决定评估顺序。优先级仅更改表达式的括号。Java中的求值顺序是 始终从左向右 ajb comments JLS 15.7 .

        2
  •  2
  •   Elijah Seed Arita    7 年前

    正如我们所知, x++ ++x 以稍微不同的方式做同样的事情。 返回该值,然后递增。 ++x 增加值,然后返回。

    逻辑很好,但你忘了一些事情。

    a ,即1,并将其添加到 ++a 1 + 2 那是三。

    你拿着 b++ . b b++ 是1,在内存中, 现在是2。因为b是2,下一部分, ++b 返回3。

    c c ,现在是2,因为你增加了它,得到3。

    下面是发生的事情:

    1 + 2 = 3

    b: 1 + 3 = 4

    c: 1 + 2 = 3

        3
  •  1
  •   ungato    7 年前

    a++ 计算为a,然后增加a。 ++a 首先递增a,然后返回a。

    从位于的运算符优先级图 http://introcs.cs.princeton.edu/java/11precedence/ ,可以看到加法是从左向右进行的。

    a + ++a a 添加到 增加1。这给了我们1+2(3)。

    b++ + ++b b 之前 在它递增之后 b++ 在它增加之后 ++b

    c++ + c : c 在它递增之前添加到