最近,不论是自己做题的过程中,还是其他小伙伴有时候遇到自增运算总是想不通,于是自己就动手做了些基础练习题,同时获得了些感悟。在这儿也顺便分享给那些还在困惑于自增运算的小伙伴们。感悟有不对之处也请批评指正。
自增自减运算
1.练习一
public class Demo02 {
public static void main(String[] args) {
int b = 4;
System.out.println(b++);//b++=4,(b=5)
//注:括号里就是我所理解的暂存值
System.out.println(b);//b=5
int x;
x=b++;//x=5,(b=6)
System.out.println(x);//x=5
System.out.println(b);//b=6
}
}
感悟:对于后增运算来说,总是先赋值,后运算。“先赋值”,即b++、x=b++为该赋值的值。“后运算”,即b的值已经发生改变,只不过在没有出现下一个b的运算之前进行暂时存放。若下次出现b的运算,则此时b的值为“后运算”或者说之前暂时存放的的值。
2.练习二
public class Demo02 {
public static void main(String[] args) {
int q = 10;
int w = 10;
int e = 10;
q = w++;
System.out.println("第一次q="+q);//q=10,(w=11)
System.out.println("第一次w="+w);//w=11
e = --q;
System.out.println("第一次e="+e);//(q=9),e=9
System.out.println("第二次q="+q);//q=9
w = ++q;
System.out.println("第二次w="+w);//q=10,w=10
System.out.println("第三次q="+q);//q=10
q = e--;
System.out.println("第四次q="+q);//q=9,(e=8)
System.out.println("第二次w="+w);//w=10
System.out.println("第二次e="+e);//e=8
System.out.println("第三次e="+--e);//e=7
}
}
感悟:对于先增或先减运算来说,总是先运算,后赋值。“先运算”,即–q、e=–q先进行运算,此时q的值已经发生变化。“后赋值”,即将刚才完成运算的值赋给e。
3.练习三
public class Demo02 {
public static void main(String[] args) {
int a1 = 4;
int b1 =(a1++)+(++a1)+(a1*10);
System.out.println(a1);//4(5)->6
System.out.println(b1);//b1=4,(a1=5)+6,(a1=6)+6*10=70
}
}
感悟:即使在一行中,自增运算的规则依然执行。
4.练习四
public class Demo02 {
public static void main(String[] args) {
int i = 1;
i = i++;//i:1,(i=2)
//前面是我最开始想的,后面是正确答案
System.out.println(i);//i:2//i:1
int j = i++;//j=i:2,(i=3)//j:1,(i=2)
int k = i+(++i*i++);//k=3+[4*4(i=5)]//k=2+[3*3(i=4)]
System.out.println(i);//i:5//i:4
System.out.println(j);//j:2//j:1
System.out.println(k);//k:19//k:11
/*
正确答案:i=1,j=1,i=4,k=11。
*/
}
}
感悟:输出的i并不是i++中暂存的值。
5.练习五
public class Demo02 {
public static void main(String[] args) {
boolean aa = 100>1;
boolean bb = 10<100;
int ee=10;
boolean b3 = aa&&(1>ee++);//短路与,(1>ee++)为false,但ee++运算继续执行
System.out.println(ee);//ee=11
System.out.println(b3);//flase
}
}
6.练习六
public class Demo02_1 {
public static void main(String[] args) {
int n1 = 3;
int n2 = 5;
int n = n2++;
System.out.println("n="+n);//n=5,(n2=6)
System.out.println("n2="+n2);//n2=6
n = ++n2;
System.out.println("n="+n);//(n2=7),n=7
System.out.println("n2="+n2);//n2=7
n = --n1;
System.out.println("n="+n);//(n1=2),n=2
System.out.println("n1="+n1);//n1=2
n = n1--;
System.out.println("n="+n);//n=2,(n1=1)
System.out.println("n1="+n1);//n1=1
}
}
参与逻辑运算符的自增运算
1.练习一
public class Demo02_1 {
public static void main(String[] args) {
int x = 1;
int y = 1;
if(x++==2 & ++y==2){//1!=2,与运算,++y==2继续运算
x=7;
}
System.out.println("x="+x+",y="+y);//x=2,y=2
}
}
感悟:与运算:前为false,后面的运算继续判断。即参与的自增运算也执行。
2.练习二
public class Demo02_1 {
public static void main(String[] args) {
int x = 1;
int y = 1;
if(x++==2 && ++y==2){//1!=2,短路与
x=7;
}
System.out.println("x="+x+",y="+y);//x=2,y=1
}
}
感悟:短路与:前为false,后面的关系直接不用判断。即自增运算也不进行。
3.练习三
public class Demo02_1 {
public static void main(String[] args) {
int x = 1;
int y = 1;
if(x++==2 | ++y==2){//1!=2,或运算,2=2
x=7;
}
System.out.println("x="+x+",y="+y);//x=7,y=2
}
}
4.练习四
public class Demo02_1 {
public static void main(String[] args) {
int x = 1;
int y = 1;
if(x++==2 || ++y==2){//1!=2,短路或,2=2
x=7;
}
System.out.println("x="+x+",y="+y);//x=7,y=2
}
}
感悟:或运算、短路或:前为false,后面的运算继续判断。即参与的自增运算也执行。