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

你能给我解释一下这段 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

399016 次浏览

在计算 a之前,++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

我上面使用的圆括号是 Java 隐式使用的。如果你这样看待这些术语,你很容易看到,它们都是相同的,因为它们是可交换的。

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

i = 6 + 7 + 7

工作 : 将 a 增加到6(当前值6) + 将 a 增加到7(当前值7)。Sum 是13,现在把它加到当前值 a (= 7)上,然后把 a 增加到8。总和为20,作业完成后 a 的值为8。

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

i = 5 + 7 + 8

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

这有帮助吗?

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++也递增该值(在后台) ,但返回变量的值保持不变——看起来它将在以后执行。

a为5时,那么 a++给表达式一个5,然后递增 a,而 ++a在传递数字给表达式之前递增 a(在这种情况下给表达式一个 a6)。

所以你计算

i = 6 + 7 + 7
i = 5 + 7 + 8

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

如果你有的话

a = 1;

你确实是

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


//Now a is 2


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

Codiver 解释了您的特定代码片段。

在上面的例子中

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
a=5; i=++a + ++a + a++;

i = 7 + 6 + 7

工作: 前/后增量具有“从右向左”的关联性,且前增量优先于后增量,因此首先将前增量作为 (++a + ++a) => 7 + 6求解。然后 a=7被提供给 post  增量 = > 7 + 6 + 7 =20a =8

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

i=7 + 7 + 6

工作: 前/后增量具有“从右向左”的关联性,并且前增量优先于后增量,因此首先将前增量作为 (++a + ++a) => 7 + 6求解。然后 a=7被提供给后增量 = > 7 + 7 + 6 =20a =8

如果不在表达式中,前增量和后增量是等价的

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

然而,我相信如果你将所有的语句组合起来,在 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

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

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

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

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

一旦你记住了规则,EZ 为你计算一切!

假设你的意思是

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)

所以 i 是6 + 7 + 7 = 20所以20被打印出来。

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

所以 i 是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。

在这两种情况下,它首先计算值,但在递增后,它保存旧值,并在计算后返回它

+ + a

  1. A = a + 1;
  2. 返回 a;

A + +

  1. 温度 = a;
  2. A = a + 1;
  3. 返回温度;

我相信你执行所有这些语句的方式都不同
一起执行的结果 = > 38,29 < br >

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)

前增量意味着变量在表达式中求值之前先增量。后递增意味着变量在被计算用于表达式之后被递增。

因此,仔细观察,你会发现这三个作业在算术上是等价的。