## 第2 章 运算符与表达式52
### 话题9 莫衷一是——i+++j 该如何计算? 52
贪心规则:尽可能地对有效字符进行结合
i+++j 会解析为i++ + j
a--b 解析为a-- b 编译出错
\1717 会解析为 \171与7
\431 会解析为\43 与1
没有贪心规则转义字符将失去作用
### 话题10 千差万别——++i 与i++仅是“先加”与“后加”的差别吗?56
(1)无论是前置还是后置++都是先加1,再计算
前++是将变量值加1,再进行计算。
后++是先把变量赋值给一个临时变量,再对变量值加1,后续计算使用的是临时变量。
int i= 2;
int j = ++i * 30;
第二行相当于:
i +=1;
j=i *30;
int i= 2;
int j = i++ * 30;
第二行相当于:
int temp = i;
i +=1;
j=temp * 30;
### 话题11 大相径庭——相除与求余在Java 中的具体表现 61
(1)除法
除数是0时,浮点运算是不会产生异常的
(2)求余
(3)+0与-0 的差异
整形是没区别
浮点型数值相等,使用“==”运算符返回true
浮点类型中的区别:
运算结果不一样
存储符号位不一样
### 话题12 移形换位——移位运算的真实剖析75
(1)移位理解误区
当左操作数是int类型,右操作数只有低5位是有效的(0~31),可以看做右操作数与掩码0x1f做与运算,再移位。
当左操作数是long类型,右操作数只有低6位是有效的(0~63),可以看做右操作数与掩码0x3f做与运算,再移位。
int i = 5 << -10
-10 补码:
1111 1111 1111 1111 1111 1111 1111 0110
低5位:
1 0110
相当于
int i = 5 << 22
跟求余是没有关系的
(2)除法跟移位误区
整数除法,向0取整
9/2,向0舍入(向下舍入),结果4
-9/2,向0舍入(向上舍入),结果-4
9 >> 1,相当向下舍入,结果4
-9 >> 1,相当向下舍入,结果-5
注意>>> 移位运算跟>>区别
>>> 无符号右移,0填充,注意负数可能会发生符号变化
### 话题13 鞭辟近里——条件运算符(?:)的类型深入 81
表达式1 ?: 表达式2 : 表达式3 ;
表达式1 必须为boolean或Boolean
表达式1 为true只计算表达式2,否则只计算表达式3
结果的类型
表达式2 | 表达式3 | 结果 |
boolean/Boolean | boolean/Boolean | boolean |
null | 引用类型 | 引用类型 |
引用类型 | null | 引用类型 |
null | 基本类型 | 基本类型包装类型 |
基本类型 | null | 基本类型包装类型 |
除boolean的基本类型 | 除boolean的基本类型 | 大范围的类型(byte,short,char->int) |
引用类型 T1 | 基本类型 T2 | 引用类型 S(S为T1,T2的最近共同父类) |
### 话题14 井然有序——运算顺序的详细挖掘86
java中计算顺序都是从左向右
### 话题15 异曲同工——交换变量的3 种方式 90
```java
方式1:通过3个变量交换
int x = 1;
int y = 2;
int temp;
temp = x;
x = y;
y = temp;
方式2:通过相加交换
小心溢出
int x = 1;
int y = 2;
x = x+y;
y = x-y;
x = x-y;
通过相减交换
小心溢出
int x = 1;
int y = 2;
x = x-y;
y = x+y;
x = y-x;
方式3:通过异或
一个变量x异或另一个变量y两次,结果为x
int x = 1;
int y = 2;
x = x^y;
y = x^y;
x = x^y;
```
平常使用方式1,面试方式3,方式2不靠谱
### 话题16 择木而栖——开关选择表达式switch 的类型内幕 95
byte,short,char,int
1.5 还可以是上面4种的包装类型,枚举类型
1.7 支持String
(1)包装类处理
转基本数据类型
Integer i = new Integer(2);
swtich(i){
case 1:
break;
case 2;
break;
}
(2)枚举处理
枚举类型自动生成一个静态匿名内部类,带一个static的int类型数组,最后转换成int比较。
(3)String处理
拆分两个switch处理,一个switch根据String对象的哈希码对应一个临时的变量,第二个switch再根据这个临时变量对应我们的操作。