学透java自增(++)自减(--)运算符
基本介绍
自增(++)和自减(--)运算符是对变量在原始值的基础上进行加1或减1的操作。
它们都有前缀和后缀两种形式。
前缀就是++在前面,后缀就是++在后面
前缀先自增(减),后缀后自增(减)
前缀形式的运算规则可以概括为:“先自增(减),后引用”,如 ++a
后缀形式的运算规则可以概括为:“先引用,后自增(减)”,如 a++。
这里所说的“引用”,指的是使用变量的值,将值放入操作栈的动作。
另外,我们还要强调一个细节:无论是前缀形式还是后缀形式,自增自减运算符的优先级要 > 赋值运算符。
一、仅有++或--
1 public class Test1 { 2 3 public static void main(String[] args) { 4 int a=2; 5 a++; 6 System.out.println(a);//输出3 7 int b=2; 8 ++b; 9 System.out.println(b);//输出3 10 } 11 }
可以看到,当仅做++或--时,不管是后缀式a++,还是前缀式++b,输出的结果都是一样的。因为仅自身++或--,并不会有“引用”,也就是不会有操作栈的动作。
二、++或--运算结果赋值给其他变量
1 public class Test1 { 2 3 public static void main(String[] args) { 4 int a=2; 5 int b=a++; 6 System.out.println(a);//输出3 7 System.out.println(b);//输出2 8 int c=2; 9 int d=++c; 10 System.out.println(c);//输出3 11 System.out.println(d);//输出3 12 } 13 }
当有赋值或加减等操作时,就会用到操作栈。
a=2 b=a++ 是后缀式,“先引用,后自增(减)”
第①步:先把a的值2,放入操作栈
第②步:a再自增变成3
第③步:将操作栈里的值2赋值给b
c=2 d=++c 是前缀式,“先自增(减),后引用”
第①步:c先自增变成3
第②步:再把c的值3,放入操作栈
第③步:将操作栈里的值3赋值给b
再来看下运算后再赋值的
1 public class Test1 { 2 3 public static void main(String[] args) { 4 int a=2; 5 int b=++a + ++a; 6 System.out.println(a);//输出4 7 System.out.println(b);//输出7 8 } 9 }
++a 是前缀式,“先自增(减),后引用”
第①步:a先自增变成3
第②步:再把a的值3,放入操作栈1
第③步:a再自增变成4
第④步:再把a的值4,放入操作栈2
第⑤步:把操作栈1中的数据3和操作栈2中的数据4相加,赋值给b
1 public class Test1 { 2 3 public static void main(String[] args) { 4 int a=2; 5 int b=++a + a++; 6 System.out.println(a);//输出4 7 System.out.println(b);//输出6 8 } 9 }
和上面相比,a++ 是后缀式,“先引用,后自增(减)”
就是上面第③步和第④步互换,先将a的值3放入操作栈2,所以输出的是3+3=6。
三、++或--运算结果赋值给自身
1 public class Test1 { 2 3 public static void main(String[] args) { 4 int a=2; 5 a=++a; 6 System.out.println(a);//输出3 7 int b=2; 8 b=b++; 9 System.out.println(b);//输出2 10 } 11 }
++a 是前缀式,“先自增(减),后引用”,所以是先自增为3,再把3放入操作栈,最后把操作栈中的3赋值给a。
b++ 是后缀式,“先引用,后自增(减)”,所以是先将b的值2放入操作栈,再自增为3,最后把操作栈中的2赋值给b。
再看个复合赋值运算+=
当语句中以复合赋值运算符给变量赋值的时候,计算机会先把复合赋值运算符左边变量的值存入操作数栈。
1 public class Test1 { 2 3 public static void main(String[] args) { 4 int a=2; 5 a+=++a + ++a; 6 System.out.println(a);//输出9 7 } 8 }
前面已经讲到,++a + ++a的值为7,计算机先把a的值2放入操作栈1,再把右边的计算结果存入操作数栈2,最后把操作数栈1和操作数栈2中的数值相加,赋值给a,所以是2+7=9。