运算符与表达式
运算符就是操作数据的工具,加减乘除、比较大小、逻辑判断、条件选择,都靠运算符来完成。用元素安抚把变量和值连起来的十字叫做表达式,表达式经过运算都会得到一个结果。
一、算符运算符:数值计算
1.1 算数运算符
| 运算符 | 含义 | 说明 |
|---|---|---|
| + | 加法/拼接 | 遇字符串变拼接 |
| - | 减法/取负 | 单目时取负数 |
| * | 乘法 | 注意整数溢出 |
| / | 除法 | 整数相除取整 |
| % | 取模(求余) | 符号同被除数 |
| ++ | 自增 | |
| - - | 自减 |
1.2 整数除法自动取整
两个整数相除结果仍然是整数,小数部分丢弃;若其中有一个是浮点数,那么结果就是浮点数。
java
Syetem.out.println(10/4) //结果:2
System.out,println(10.0/4) //结果2.5
1.3取模运算
取模运算的结果与被除数一致。
java
Syetem.out.println(10/3) //结果:1
Syetem.out.println(-10/3) //结果:-1
1.4 +的双重身份
+遇到字符串时变成字符串拼接符,从左到右依次执行
java
int a=10;
int b=20;
Syetem.out.println(a+b) //30纯加法
Syetem.out.println("结果是"+a+b) //结果是1020
1.5 字符的+运算
char类型参与算术运算时,会使用它在Unciode表中对应的整数值
java
Syetem.out.println("A"+1) //66
二、赋值运算符
=等于号:基本赋值运算符,作用是把右边的值交给左边的变量
| 运算符 | 等价于 |
|---|---|
| = | a=b |
| += | a=a+b |
| -= | a=a-b |
| *= | a=a*b |
| /= | a=a/b |
| %= | a=a%b |
复合赋值运算符运算时会进行强制类型转换。
java
byte b=10;
b=b+1; //会报错,b+1自动提升为int不能赋值给byte
b+=1; //正确的,等价于b=(byte)(b+1)
三、自增自减
++让变量+1,--让变量-1.
3.1 单独使用:前后无差别
让自增或自减独占一行放在前面和后面没有差别
3.2 混合使用
当自增自减混合使用时,放在前面先加后用,放在后面先用后加
java
//前置++a;先自增,再用新值参与运算
int a=5;
int b=++a; //a先变成6,y再拿6
//后置a++:先用原值参与计算,再自增
int c=a++; //a先拿5,c再变成6
四、关系运算符:比较大小
关系运算符是用来比较两个值的大小是否相等,结果一定是true或false。通常配合if判断使用。
| 运算符 | 含义 |
|---|---|
| == | 等于 |
| != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
==与=
==是判断相等有两个等号,=是赋值一个等号。若是写错会报错
String的比较方法
对引用类型String,==比较的是内存地址是否相同,不是内容是否相等。字符串内容比较使用.equals()方法
java
String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1==s2); //false地址不同
System.out.println(s1.equals(s2)); //true内容相同
五、逻辑运算符:多条件组合
逻辑运算符用来组合多个布尔条件,结果仍是布尔值
| 运算符 | 名称 | 规则 | 短路 |
|---|---|---|---|
| && | 短路与 | 两边都true才true | 左边false右边不执行 |
| || | 短路或 | 一边true就true | 左边true则右边不执行 |
| ! | 逻辑非 | 取反 | - |
| & | 逻辑与 | 同&& | 两边都执行 |
| | | 逻辑或 | 同|| | 两边都执行 |
| ^ | 逻辑异或 | 左右不同才true | - |
5.1 &&、||vs&、|
&&与||具有短路特性------左边已经能确定结果时,右边不在执行,更高效,也更安全;&与|使用时两边都要执行,运行效率比&&和||低,日常开发首先短路与与短路或。
java
int x=5;
boolean r3=(x>0)||(x++<10); //左true,x++不执行,x=5
boolean r4=(x>0)|(x++<10); //两边都执行,x=6
5.2 逻辑非!
!用来翻转布尔值
java
boolean a=true;
System.out.println(!a); //false
六、三元运算符?::简化的if-else
格式:条件表达式?值1:值2
规则:条件为true取值1,条件为false取值2
java
//求两个数最大值
int a=10,b=20;
int max=(a>b)?a:b //max=20
七、位运算符(了解即可)
位运算符直接操作二进制位,日常开发用的不多,但是在高性能计算、加密、位图、网络协议等场景会遇到
| 运算符 | 含义 |
|---|---|
| & | 按位与 |
| | | 按位或 |
| ^ | 按位异或 |
| ~ | 按位取反 |
| << | 左移 |
| >> | 右移 |
| >>> | 无符号右移 |
八、表达式类型自动提升
当表达式里出现多种数据类型混合运算时,java会自动做类型提升。
-
规则1:byte/short/char统一提升为int
- 只要有byte、short、char参与运算,全部先变成int再算,结果也是int:
javabyte b1=10,b2=20; int b3=b1+b2; //int直接接收 byte b4=(byte)(b1+b2); //需要强制转换 -
规则2:整体提升到表达式中最高等级类型
- 类型大小等级:byte-short-int-long-float-double
javaint a=10; double b=3.14; double c=a+b; //a自动提升为double,结果是double -
建议:开发中整数直接用int不够long;小数直接用double。byre/short/char只在特殊场景(如网络协议,文件IO等)使用,可以大幅度减少类型转换问题。
九、运算符优先级
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 1(最高) | ()、\[\] | 小括号、下标 |
| 2 | ++、--、!、~ | 单目运算符(前置) |
| 3 | *、/、% | 乘除取模 |
| 4 | +、- | 加减 |
| 5 | <<、>>、>>> | 移位 |
| 6 | <、<=、>、>=、instanceof | 关系比较 |
| 9 | ^ | 按位异或 |
| 10 | | | 按位或11&&逻辑与 |
| 12 | || | 逻辑或 |
| 13 | ? : | 三元 |
| 14(最低) | =、+=、-=、*=、/=、%= | 赋值 |
十、坑
- 整数相除丢小数
- +号字符串拼接顺序
- 自增自减前后设置混淆
- 把==写成=
- 用==比较String内容
- 短路运算导致右边代码没执行
- 复合赋值运算的隐式强制转换
- 浮点数用==比较