你能向我解释这段 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
++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 解释了您的特定片段。
这有帮助吗?
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++
还会增加值(在后台)但返回变量的不变值 - 看起来它稍后会执行。
在这两种情况下,它首先计算值,但在后增量中它保存旧值,计算后返回它
++一个
一个++
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。
++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 隐式使用。如果您以这种方式查看这些术语,您可以很容易地看到它们都是相同的,因为它们是可交换的。
在上面的例子中
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 是前缀递增运算符:
a++ 是后缀增量运算符:
一旦你记住了规则,EZ 就可以为你计算一切!
但是,我相信,如果您将所有语句结合起来并在 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
假设你的意思是
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。
whena
是 5,然后a++
给表达式一个 5 并在a
之后递增,而在将数字传递给表达式之前递增(在这种情况下给++a
表达式6)。a
a
所以你计算
i = 6 + 7 + 7
i = 5 + 7 + 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
我相信你正在执行所有这些语句以不同的方式
一起执行将导致 => 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)
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 =20
和a =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 =20
和a =8
。