您能向我解释一下此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
您能向我解释一下此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
Answers:
这有帮助吗?
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++
也会增加该值(在后台),但返回不变的变量值-看起来稍后会执行。
int a = 1; int b = a++; int c = ++b;
期望b为1,因为它是后增量。
在这两种情况下,它都首先计算值,但在增量计算中,它保留旧值,计算后返回它
++一
a ++
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。
++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
我上面使用的括号由Java隐式使用。如果您以这种方式查看这些术语,则可以很容易地看出它们都是可交换的。
假设你的意思是
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。
当a
为5 时,则为a++
表达式赋予5,然后递增a
,而在将数字传递给表达式之前++a
递增a
(即a
在这种情况下,表达式 6)。
所以你计算
i = 6 + 7 + 7
i = 5 + 7 + 8
但是我相信,如果您结合所有语句并在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=5; i=++a + ++a + a++;
是
i = 7 + 6 + 7
工作:pre / post增量具有“从右到左”的关联性,并且pre优先于post,因此,所有pre增量首先将求解为(++a + ++a) => 7 + 6
。然后a=7
提供来发布递增=> 7 + 6 + 7 =20
和a =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 =20
和a =8
。
我相信您正在以不同的方式
一起执行所有这些语句
将导致=> 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)