119

你能向我解释这段 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

4

14 回答 14

239

++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 解释了您的特定片段。

于 2010-03-03T12:27:35.723 回答
173

这有帮助吗?

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

于 2010-03-03T12:25:43.807 回答
76

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

++一个

  1. 一 = 一 + 1;
  2. 返回一个;

一个++

  1. 温度=一个;
  2. 一 = 一 + 1;
  3. 返回温度;
于 2017-09-19T06:13:24.433 回答
23
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)。将 a 从当前值 6 增加到 7 以获得 + 的其他操作数。总和为 12,a 的当前值为 7。接下来将 a 从 7 递增到 8(当前值 = 8)并将其添加到之前的总和 12 以得到 20。

于 2010-03-03T12:25:41.730 回答
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

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

于 2010-03-03T12:24:26.900 回答
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
于 2014-09-05T07:57:57.303 回答
6

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

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

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

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

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

于 2017-06-29T16:02:46.523 回答
5

但是,我相信,如果您将所有语句结合起来并在 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
于 2016-09-15T17:46:56.103 回答
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)

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

于 2017-09-14T10:05:42.997 回答
3

whena是 5,然后a++给表达式一个 5 并在a之后递增,而在将数字传递给表达式之前递增(在这种情况下给++a表达式6)。aa

所以你计算

i = 6 + 7 + 7
i = 5 + 7 + 8
于 2010-03-03T12:26:20.047 回答
3

预递增意味着变量在表达式中被计算之前递增。后增量意味着变量在被评估后在表达式中使用后递增。

因此,仔细看,你会发现这三个赋值在算术上是等价的。

于 2018-11-04T19:03:46.437 回答
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
于 2016-06-12T20:16:39.780 回答
1

我相信你正在执行所有这些语句以不同的方式
一起执行将导致 => 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)
于 2017-10-23T23:01:39.373 回答
0
a=5; i=++a + ++a + a++;

i = 7 + 6 + 7

工作: pre/post 增量具有“从右到左”的关联性,并且 pre 优先于 post ,所以首先 pre increment 将被解决为(++a + ++a) => 7 + 6。thena=7提供给 post increment =>7 + 6 + 7 =20a =8.

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

i=7 + 7 + 6

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

于 2015-10-30T05:40:34.780 回答