你能解释一下这个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
答案 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)
在这两种情况下,它首先计算值,但是在后增量中它保持旧值并且在计算后返回它
<强> ++一个强>
<强>一个++ 强>
答案 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
会增加a
。
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隐式使用。如果你以这种方式看待这些术语,你可以很容易地看到,它们都是可交换的。
答案 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 =20
和a =8
。
a=5; i=a++ + ++a + ++a;
是
i=7 + 7 + 6
工作:前/后增量具有“从右到左”的关联性,并且pre优先于post,所以首先预增量将被解析为(++a + ++a) => 7 + 6
。然后a=7
提供给帖子increment =&gt; 7 + 7 + 6 =20
和a =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)