等式" i ++ + ++ i"的计算顺序是什么?在Java?

时间:2017-07-23 23:33:19

标签: java operators increment operator-precedence

考虑一下代码段:

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 个答案:

答案 0 :(得分:8)

一元邮政和预增量的优先级高于加法:

  1. b = 1b初始化为1。
  2. b++b'等式中的当前值为1,然后b递增
  3. ++bb由于后递增而递增,所以它是2.现在它由于预增量而再次递增,并且它在等式中的值是3。
  4. 1 + 3是4。
  5. 问题是,预增量增加变量,然后将其返回,因此在++1中,值递增,然后返回,并计算为2。递增,返回变量值,然后递增。因此1++将评估为1,然后在以后引用时增加到2。所以:

    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
      
    4. 这也适用于第一和第三个例子。对于a + ++a++a具有更高的优先级。首先,计算a,此时为1,然后评估++a,因为它具有更高的优先级,其中a递增,然后值返回并计算为2。 ,评估添加,如下所示:

      1. a + ++a
        ^
        nothing, evaluates to 1
        
      2. 1 + ++a
            ^^^
            pre-increment, evaluates to 2
        
      3. 1 + 2
        ^^^^^
        evaluates to 3
        
      4. 在第三个示例中,c++ + cc后递增,因此它的计算结果为1,然后递增。最后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
          ^^^^^
          evaluates to 3
          
        4. 因此输出:

          3
          4
          3
          

          应该注意,优先权并不决定评估顺序。优先级仅更改表达式的括号。 Java中的评估顺序始终从左到右ajb comments,与C / C ++不同,请参阅JLS 15.7

答案 1 :(得分:2)

众所周知,x++++x以不同的方式做同样的事情。 x++返回该值,然后递增。 ++x递增值,然后返回它。

良好的逻辑,但你忘记了一些事情。

首先,您取a,即1,然后将其添加到++a。前面的++会使它从1增加到2,而等式现在是1 + 2。那是三个。

您选择b++b之前是{1},因为你把++放在后面,它给方程的其余部分提供了初始值1,然后将变量增加到2.但你忘记了即使值我们从b++获得的是1,在内存中,b现在是2.由于b是2,下一部分++b将返回3.

同样的错误发生在第3部分。 c返回1,然后递增到2。然后你将{1}添加到c,现在增加了1,因为你增加了它,你得到3。

所以发生了什么:

a:1 + 2 = 3

b:1 + 3 = 4

c:1 + 2 = 3

答案 2 :(得分:1)

a++评估为a,然后递增a。 ++a首先递增a,然后返回a。

http://introcs.cs.princeton.edu/java/11precedence/的运算符优先级图表中,您可以看到添加工作从左到右。

浏览每个示例,其中每个变量从1开始:

a + ++aa被添加到a,加1。这给我们1 + 2(3)。

b++ + ++bb 之前它增加后会在b增加b++之后添加到++b之后#&} 39; s递增c++ + c。这给了我们1 + 3(4)。

cc在递增之后会在递增后添加到rows=tdf.values.tolist() cursor.execute('select * from job_req_t where rownum <1') db_types = (ele[1] for ele in cursor.description) cursor.setinputsizes(*db_types)# to avoid hard coding cursor.bindarraysize = 200 insertstmt2=''' INSERT INTO job_req_t (ID,col2,col3,col4lco5,col6,col7 )VALUES (:1,:2,:3,:4,:5,:6,:7) ''' cursor.prepare(insertstmt2) cursor.executemany(None,rows) ,给出1 + 2(3)。