- 运算符
- 用于操作变量和数值的操作符,运算符与数值组成的表达式。
- 按功能分类
- 赋值运算符:=,左侧只能是变量,右侧可以是变量、常量或表达式
- 算术运算符:+-*/ % ++ --
- ++ -- :只能操作证书类型,char,不能表达式。当前变量加1或减1。
- 前置:先加减,再使用
- 后置:先使用,再加减
- i=i++问题 :先设置一个临时变量itmp= i,然后i=itmp;itmp++;所以i的值未变。
- 赋值运算和算术运算可简写:+=,-=,*=,/=,%=
- ++ -- :只能操作证书类型,char,不能表达式。当前变量加1或减1。
- 关系运算符:关系运算符一般用于条件判断,结果为boolean类型
- >,>=,<,<=,==,!=
- 逻辑运算符
- && 逻辑与,“并且”;左右结果必须为Boolean类型,从左至右一错即短路
- || 逻辑或,“或者”;左右结果必须为Boolean类型,从左至右一对即短路
- ! 逻辑非,对变量取反
- 短路逻辑应用场景
- 假设存在变量name,判断name的值是否为admin
- if(name.equals("admin")){} 这种写法当name为空时会产生空指针异常
- 改写:if(name!=null&&name.equals("admin")){}
- 假设存在多个判断条件,其中一个判断比较耗时,比如判断a不耗时,b耗时
- 则:if(a&&b){} 如果a为false,则不用判断b了,减少耗时
- 假设存在变量name,判断name的值是否为admin
- 位运算符:
- & 按位与 6&2 等价于 0b110 & 0b010 = 0b010 (2)
- | 按位或 6|2 等价于 0b110 | 0b010 = 0b110 (6)
- ^ 异或 :相同为1,不同为0. 6^2 等价于 0b110^0b010 = 0b100 (4)
- << 按位左移:整个数位左移,最右面补0。左移n位,表示原数值*2的n次方。
- >> 按位右移:整个数位右移,如果是正数最左面补0,负数补1。右移n位,表示原数值除以2的n次方。
- >>> 无符号右移, 整个数位右移,左侧补0。
- 注:&、| 也可以操作布尔类型的变量或者表达式,但没有短路效果
- 条件运算符:表达式1?表达式2:表达式3
- 先判断1,1为true结果为2的值,false为3的值。
- 按照运算符的操作个数分类
- 一元运算符:! ++ --
- 二元运算符:= + - * / % >> <<
- 三元运算符:?:
- 运算符的优先级
- 一元>二元>三元
- 算术>关系>逻辑>赋值
- 使用小括号提升优先级
- 表达式
- 与运算符与操作数(变量、常量)组成的式子。单个操作数也可算。
- 按照操作符类型分
- 算术表达式:就是运算之后的值。
- 关系表达式:Boolean类型的值。
- 逻辑表达式:Boolean类型的值。
- 赋值表达式:所赋的值就是表达式的值。
- 表达式的类型:结果值的类型就是表达式的数据类型。
- 类型的提升:参与表达式的数据属于不同的类型,会对结果类型造成影响。
- 自动类型转换
- 字符串的拼接符 +
- "hello" + num (num = 10) "hello10"
- 类型的提升:参与表达式的数据属于不同的类型,会对结果类型造成影响。
- 类型转换
- 操作数不同数据类型,结果只能取一个,需转换为相同的数据类型参与操作。
- 分类
- 自动类型转换(隐式类型装换)
- 规则
- 1、两种数据类型兼容
- 2、转换前的数据类型(源)小于转换后的数据类型(目标)范围
- 方向:从左到右可以自动发生转换
- byte(char/short)-->int -->long-->double
- byte、char、short各自转为int类型
- 注:
- 即使自动类型转换也可能发生精度的丢失:long-->float
- 反向也可以自动类型转换:int到byte(short/cahr),不能超过byte的范围
- 规则
- 强制类型转换(显式类型转换)
- 变量 = (目标类型)源数据;
- 强制类型转换有可能发生精度的丢失或数据溢出。
- 强制类型转换前后的数据类型要兼容,Boolean类型不能与其他类型互转。
- 自动类型转换(隐式类型装换)
- 练习:定义两个int类型的数,输出它们的和。