后增量(i ++)和预增量(++ i)运算符如何在Java中工作?

时间:2010-03-03 12:21:43

标签: java post-increment pre-increment

你能解释一下这个Java代码的输出吗?

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

两种情况下的输出均为20

14 个答案:

答案 0 :(得分:170)

++a递增,然后使用变量 a++使用然后递增变量。

如果你有

a = 1;

你做了

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

codaddict explains您的特定代码段。

答案 1 :(得分:123)

这有帮助吗?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

重点是++a递增值并立即返回它。

a++也会增加值(在后台)但返回变量的未更改值 - 看起来稍后会执行。

答案 2 :(得分:36)

在这两种情况下,它首先计算值,但是在后增量中它保持旧值并且在计算后返回它

<强> ++一个

  1. a = a + 1;
  2. 返回a;
  3. <强>一个++

    1. temp = a;
    2. a = a + 1;
    3. return temp;

答案 3 :(得分:18)

i = ++a + ++a + a++;

i = 6 + 7 + 7

工作:将a增加到6(当前值6)+增加a到7(当前值7)。 Sum为13,现在将其添加到a(= 7)的当前值,然后将a增加到8. Sum为20,赋值完成后的a值为8.

i = a++ + ++a + ++a;

i = 5 + 7 + 8

工作:a的起始值为5.在添加中使用它,然后将其增加到6(当前值6)。将当前值6增加到7以获得+的其他操作数。 Sum为12,a的当前值为7.接下来将a从7增加到8(当前值= 8)并将其加到前一个12并得到20.

答案 4 :(得分:8)

在评估之前,

++a会增加aa++评估a,然后递增它。

与您的表达相关:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

我上面使用的parenteses被Java隐式使用。如果你以这种方式看待这些术语,你可以很容易地看到,它们都是可交换的。

答案 5 :(得分:6)

在上面的例子中

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29

答案 6 :(得分:3)

++ a是前缀增量运算符:

  • 首先计算并存储结果,
  • 然后使用变量。

a ++是后缀增量运算符:

  • 首先使用变量,
  • 然后计算并存储结果。

一旦你记住规则,EZ就可以计算一切!

答案 7 :(得分:2)

我相信如果你把所有的陈述结合起来并在Java 8.1中运行它,你会得到一个不同的答案,至少这是我的经验所说的。

代码将如下工作:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29

答案 8 :(得分:2)

假设你的意思是

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

评估结果为:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

所以我是6 + 7 + 7 = 20,所以打印20个。

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

所以我是5 + 7 + 8 = 20,所以20再次打印。

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

并且在评估了所有右侧(包括将a设置为8)后,将a设置为6 + 7 + 7 = 20,最后打印20次。

答案 9 :(得分:1)

a为5时,a++为表达式提供5,然后递增a,而++a在将数字传递给a之前递增a表达式(在这种情况下,表达式为i = 6 + 7 + 7 i = 5 + 7 + 8 6)。

所以你计算

{{1}}

答案 10 :(得分:1)

预递增表示变量在表达式中求值之前先递增。后递增表示变量已被评估以在表达式中使用后递增。

因此,仔细查看,您会发现所有三个分配在算术上都是等效的。

答案 11 :(得分:0)

a=5; i=++a + ++a + a++;

i = 7 + 6 + 7

工作:前/后增量具有“从右到左”的相关性,并且pre优先于post,因此首先预增量将被解析为(++a + ++a) => 7 + 6。然后提供a=7以发布增量=&gt; 7 + 6 + 7 =20a =8

a=5; i=a++ + ++a + ++a;

i=7 + 7 + 6

工作:前/后增量具有“从右到左”的关联性,并且pre优先于post,所以首先预增量将被解析为(++a + ++a) => 7 + 6。然后a=7提供给帖子increment =&gt; 7 + 7 + 6 =20a =8

答案 12 :(得分:0)

如果不在表达式

中,

预增量和后增量是等效的

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10

答案 13 :(得分:0)

我相信你以不同的方式执行所有这些陈述
一起执行将导致结果=&gt; 38,29

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)