运算符
1.1 运算符的分类
- 按功能分:
算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、条件运算符、字符串连接运算符和其他运算符 - 按操作数数目分:
单目运算符(1 个操作数)、双目运算符(2 个操作数)和三目运算符(3 个操作数)
什么是操作数和操作符?
例如 1+2,其中 1 和 2 都是操作数,+是操作符,操作符和操作数联合起来构成表达式
1.2 算术运算符
- ++ 自加1
++ 可以出现在变量前或后
++ 出现在变量后,会先做赋值运算,再自加1
int m = 20;
int n = m++;
System.out.println(n); //n = 20
System.out.println(m); //m = 21
++ 出现在变量前,会先做自加1,再赋值运算
int m = 20;
int n = ++m;
System.out.println(n); //n = 21
System.out.println(m); //m = 21
- “–”同理
1.3 关系运算符
- 所有的关系运算符的运算结果都是布尔类型,即true或false,不可能有其他值
= :赋值运算符
== :关系运算符,判断是否相等
关系运算符中如果有两个符号的话,两个符号之间不能有空格
1.4 逻辑运算符
- 逻辑运算符两边要求都是布尔类型,并且最终的运算结果也是布尔类型
- &(逻辑与)
两边都是true,结果是true
“&”无论什么情况,后面表达式都要运算 - | (逻辑或)
有一边是true,结果是true - !(逻辑非)
取反 - && (短路与)
“&&”是短路与,只要第一个表达式满足了整个表达式的值,后面的表达式就不再进行运算了
int x = 10;
int y = 11;
System.out.println(x > y & x > y++); //右边x > y++执行
System.out.println(y); //y = 12
int m = 10;
int n = 11;
System.out.println(m > n && m > n++); //右边m > n++不执行
System.out.println(n); //n = 11
“&&”比“&”效率高,开发中经常用“&&”做判断 ,只有当需要左右两边都执行的时候,选择逻辑与 &
- || (短路或)
有一边是true,结果是true,所以,当左边为true的,右边的表达式不执行
1.5 赋值运算符
- 分类
- 基本赋值运算符
= - 扩展赋值运算符
+=、-=、*=、/=、%=…
扩展运算符在编写的时候,两个符号之间不能有空格
- 赋值运算符右边的优先级比较高,先执行右边的表达式,然后将执行结果赋值给左边
int n = 10;
n += 20; //n变量追加20(n = n + 20)
System.out.println(n); //n = 30
- n += 20与n = n + 20完全一样吗?
不一样,本质上并不是完全相同 ,只能说是相似
byte a = 100;
a = a + 1;
System.out.println(a); //编译不通过,(错误:不兼容的类型),编译器检测到a + 1是int类型,int类型不能直接赋值给byte类型的变量
byte a = 100;
a += 1; //其实a += 1等同于a = (byte)(a + 1)
System.out.println(a); //编译通过(语法机制:使用扩展赋值运算符的时候,永远都不会改变运算结果类型)
语法机制:使用扩展赋值运算符的时候,永远都不会改变运算结果类型
1.6 条件运算符
- 条件运算符也成为三目运算符,语法格式为:
布尔表达式?表达式1:表达式2 - 执行原理:
布尔表达式的结果为true,表达式1的执行结果作为整个表达式的结果;布尔表达式的结果为false,表达式2的执行结果作为整个表达式的结果
1.7 字符串连接运算符
- 字符串连接运算符:+
+在Java中有两个作用:求和、字符串拼接
当 + 运算符两边都是数字类型的时候,求和;
当 + 运算符两边的任意一边是字符串类型,那么这个 + 会进行字符串拼接操作;
字符串拼接完成之后结果还是一个字符;
当一个表达式中有多个加号时,遵循自左向右的顺序依次执行(除非额外加了小括号) - 小技巧:
把变量加到一个字符串当中
"+变量名+"