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


99

您能向我解释一下此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


9
始终避免模棱两可的陈述:)
Prasoon Saurav'3

9
@Prasoon Saurav与C和C ++不同,Java和C#严格定义了求值顺序,因此这些语句没有歧义。
Pete Kirkham'3

12
我知道,但是那些语句仍然没有(不能)用于实际目的,因此必须避免。
Prasoon Saurav'3


4
@PeteKirkham已经过了六年,但是我仍然要指出,在这种情况下,“模棱两可”是模棱两可的-可能意味着“编译器不知道要放什么”,或者可能意味着“程序员不知道这意味着什么”。
基金莫妮卡的诉讼

Answers:


150

这有帮助吗?

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++ 也会增加该值(在后台),但返回不变的变量值-看起来稍后会执行。


5
您确定第二个中的== 9吗?
皮特·柯坎

1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8)由于后递增优先级最高,是否先执行a ++?
rsirs '17

2
易于解释的复杂示例。
oznus

对于C#和C ++,此答案是否相同?
workoverflow

为什么在这里a,b和c等于2?int a = 1; int b = a++; int c = ++b;期望b为1,因为它是后增量。
丹尼斯

202

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

如果你有

a = 1;

你也是

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

//Now a is 2

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

编码说明您的特定代码段。



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

i = 6 + 7 + 7

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

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

i = 5 + 7 + 8

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


这些语句从右到左还是从左到右起作用?
阿比耶特(Abhijeet)

10

++aa在评估之前递增。 a++求值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隐式使用。如果您以这种方式查看这些术语,则可以很容易地看出它们都是可交换的。


1
@KlasLindbäck交换意味着您可以交换两个表达式,但仍获得相同的结果。因此a ++ + ++ a == ++ a + a ++(5 + 7 == 6 + 6; a == 7结尾)。
Aurril

8

在上面的例子中

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

4

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

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

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

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

记住规则后,EZ for ya即可计算一切!


4

假设你的意思是

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),然后将THEn a设置为6 + 7 + 7 = 20,因此最后一次打印20。


3

a为5 时,则为a++表达式赋予5,然后递增a,而在将数字传递给表达式之前++a递增a(即a在这种情况下,表达式 6)。

所以你计算

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

3

但是我相信,如果您结合所有语句并在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

3

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

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


2

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

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

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

i = 7 + 6 + 7

工作:pre / post增量具有“从右到左”的关联性,并且pre优先于post,因此,所有pre增量首先将求解为(++a + ++a) => 7 + 6。然后a=7提供来发布递增=> 7 + 6 + 7 =20a =8

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

i=7 + 7 + 6

工作:pre / post增量具有“从右到左”的关联性,并且pre优先于post,因此首先要解决pre增量,因为(++a + ++a) => 7 + 6.then a=7提供给post递增=> 7 + 7 + 6 =20a =8


0

我相信您正在以不同的方式
一起执行所有这些语句 将导致=> 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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.