[Java编程思想] 第三章 操作符
第三章 操作符
3.1 优先级
请注意,System.out.println()语句中包含“+”操作符,“+”意味着“字符串连接”,并且如果必要,它还要执行“字符串转换”。当编译器观察到一个String后面紧跟着一个“+”,而这个“+”的后面又紧跟和一个非String类型的元素时,就会尝试着将这个非String类型的元素转换为String。
3.2 赋值
对基本数据类型的赋值很简单。赋值操作符“=”,取右边的值赋给左边。
但在为对象“赋值”时,对一个对象进行操作时,我们真正操作的是对象的引用。所以倘若“将一个对象赋值给另一个对象”,实际上是将“引用”从一个地方复制到另一个地方。假若对对象使用c=d,那么c和d都指向原本只有d指向的那个对象。
3.3 算数操作符
整数除法会直接去掉结果的小数位,而不是四舍五入。
3.4 自动递增和递减
理解前缀式和后缀式执行过程,入栈顺序
举个例子来说,假设a是int值,则表达式++a就等价于(a = a + 1),递增和递减操作符不仅改变了变量,而且以变量的值作为生成的结果。
3.4.1 前缀式(++i)
对于前缀递增或递减(如++a或--a),会先执行运算,再生成值。
先自增,再入栈
int i = 0;
int j = 0;
j = ++i;
问:j=?i=?
--------过程--------------
0. 从=右边开始执行
1. 遇到++,将i从0自增为1
2. 遇到i,将i入栈,此时栈内i=1
3. 遇到;结束运算,出栈
4. j被赋值为1
--------结果--------------
i = 1,j = 1;
因为i先自增,变量为1,1再入栈,从栈中取出1,赋给j
3.4.2 后缀式(i--)
对于后缀递增或递减(如a++或a--),会先生成值,再执行运算。
先入栈,再自增
int i = 0;
i = i++;
问:i=?
--------过程--------------
0. 从=右边开始执行
1. 遇到i,将i入栈,此时栈内i=0
2. 遇到++,在栈外将i从0自增为1
3. 遇到;结束运算,出栈
4. i被从栈内取出的i=0赋值
--------结果--------------
i = 0;
因为i入栈时是0,出栈时还是0,所以给i赋值为0
//下面涉及到栈内栈外两个区域
int i = 0;
int j = 0;
j = i++;
问:i=?j=?
--------过程--------------
0. 从=右边开始执行
1. 遇到i,将i入栈,此时栈内i=0
2. 遇到++,在栈外将i从0自增为1
3. 遇到;结束运算,出栈
4. j被从栈内取出的i=0赋值
5. i在栈外被自增为1
--------结果--------------
i = 1,j = 0;
因为i入栈为0,然后变量i自增1,此时i出栈是0赋给j,i为1不变
3.5 关系操作符
== 对象引用。
equals() 对象内容(需重写equals()方法,基本类型用==)。
3.6 字符串操作符+
连接不同的字符串,如果String后面跟着int类型,会将int变量转换为String,通常使用一个空的String后面跟随+和一个基本类型变量,这是一种字符串转换方式。
3.7 截尾和提升
将float或double转型为整型值时,总是对该数字执行截尾,如果想得到舍入的结果,需要使用java.lang.Math的round()方法。
Math.round()返回最接近的最大整数
3.5=>4
-3.5=>3
只要类型比int小(即char、byte、short),那么在运算前,这些值自动转换成int。如果想把结果赋值给较小的类型,就必须使用类型转换(可能出现信息丢失)。