后增量(i ++)和前增量(++ i)运算符在Java中如何工作?
你能向我解释这个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 = 5; i=++a + ++a + a++; => i=6 + 7 + 7; (a=8) a = 5; i=a++ + ++a + ++a; => i=5 + 7 + 8; (a=8)
++a
递增,然后使用variables。
a++
使用然后递增variables。
如果你有
a = 1;
而你呢
System.out.println(a++); //You will see 1 //Now a is 2 System.out.println(++a); //You will see 3
@codaddict解释你的特定片段。
i = ++a + ++a + a++;
是
i = 6 + 7 + 7
工作 :将a递增到6(当前值6)+递增a到7(当前值7)。 总和为13,现在将其添加到当前值(= 7),然后将a递增到8.总和为20,分配完成后的值为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
然后增加它。
与你的expression相关:
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,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 + 1;
- 返回一个;
A ++
- temp = a;
- a = a + 1;
- 返回温度
当a
是5时, a++
给出expression式5,然后递增a
,而++a
a
在将数字传递给expression式(在这种情况下给出expression式6)之前递增a
。
所以你计算
i = 6 + 7 + 7 i = 5 + 7 + 8
但是我相信,如果你把所有的语句结合起来,并运行在Java 8.1中,你将得到一个不同的答案,至less这就是我的经验所说的。
代码将如下工作:
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是前缀增量运算符:
- 结果先计算并存储,
- 那么使用variables。
a ++是后缀增量运算符:
- 首先使用variables,
- 然后计算并存储结果。
一旦你记得规则,EZ为你计算一切!
假定你的意思
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 8) + (8, a is now 9)
所以我是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被打印最后的时间。
如果不是在expression式中,则前增量和后增量是等效的
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
a=5; i=++a + ++a + a++;
是
i = 7 + 6 + 7
工作:前/后增量具有“从右到左”的关联性,而前有优先级,因此首先预增量将被解为(++a + ++a) => 7 + 6
。 那么提供a=7
来提升增量=> 7 + 6 + 7 =20
和a =8
。
a=5; i=a++ + ++a + ++a;
是
i=7 + 7 + 6
工作:前/后增量具有“从右到左”的关联性,并且前置优先于后置,所以首先预先增量将被解为(++a + ++a) => 7 + 6
,然后a=7
提供后增量=> 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)
只要提到这些原则和形象,你会在几分钟内成为亲。
原理:-
1.)当一元运算符++和 – 用于前缀表示法时,variables的值在expression式中使用variables之前递增/递减。
2.)当一元运算符++和 – 用于后缀表示法时,variables的值在expression式中使用variables之后递增/递减。
示例: – 图像中expression式的评估从左到右。 假设一个是10。
Your Question:- int a = 5, i; i = ++a + ++a + a++; i = a++ + ++a + ++a; a = ++a + ++a + a++; System.out.println(a); System.out.println(i); Answer:- i = 6 + 7 + 7; [a = 8] i = 8 + 10 + 11; a = 12 + 13 + 13; [a = 14] O/P :- 38 29