对于Java里面的自增说明
自增分为前自增和后自增,也就是常说的前加加和后加加。它们作为单目运算符,作用在不同类型的变量类型身上会有不同的效果。
共性:它们最后的结果都会使变量对应的值进行加一操作。
区别:如果结合赋值运算符进行运算时,前自增是先将变量对于的值加一之后,然后再进行赋值操作。而后自增则是先将变量对应的值进行赋值操作,然后再进行加一的操作。
由于对特定类型进行自增操作,会存在一个强制类型转换问题,因此
当某一个类型进行自增操作时,结果应该用相同类型的变量来进行接收
。
1. 对于整数类型的自增操作
1.1 byte、short、char
这三种基本数据类型,任何排列组合进行运算,结果都会转为
int
类型,但是自增操作会有一个强制类型转换
操作。因此必须注意区别~~~
byte b = 3;
byte c = b++;
byte d = ++b;
System.out.println("b="+b+"\t"+"c="+c+"\t"+"d="+d);
//结果分别为:b = 5 c = 3 d = 5
这里的b++
的实质就是b= (byte) b+1;
同理,对于short
和char
来说,也是一样。
疑问?为什么 byte b = 3不报错?
其实这是编译器的一个原理,它先会查找所赋的值是否在byte
所能容纳的范围内,如果在这个范围内,就可以赋值成功,反之,就会报错~~
1.2 int、long
对于int和long的原理也是类似,它们自增后,也仍然保持自己原有的类型不变。
2.对于浮点数的自增操作
浮点数也是一样的,自增后,仍然保持原有的类型不变。
3.扩展
3.1 和自增类似能保持类型不变的情况就是扩展的赋值运算符,+=、-=、*=、/=、%=
,它们和上面的规则一样,都满足运算之后,仍然保持原有的类型不变。
short c = 12;
c+=5;
System.out.println("c="+c);
//c = 17,此时c的类型仍然为short类型,并不是int类型!
3.2 神奇的自增
byte i = 12;
i = i++;
System.out.println("i="+i);
// i = 12;
初次看到,肯定会写13,但是是错的!它其实是jvm给我们默认初始化了一个临时变量进行存储。真正的过程是这样的:
byte i = 12;
byte temp = i;
i = (byte) i+1;
i = temp;
上面就是真正的过程,至于强制类型转换参考上面的运算规则~~