9. Java语言基础 - 运算符
按功能分类 | 符号 |
---|---|
算术运算符 | + (加) - (减) * (乘) / (除) % (求余) ++ (自加1) -- (自减1) |
关系运算符 | > (大于) >= (大于等于) < (小于) <= (小于等于) == (等于) != (不等于) |
逻辑运算符 | &(逻辑与) | (逻辑或) ! (逻辑非) && (短路与) || (短路或) |
赋值运算符 | = (赋值) += () -= *= /= %= ^= &= |= <<= >>= |
位运算符 | & (按位与) | (按位或) ^ (按位异或) ~ (按位取反) << (左移) >> (带符号右移) >>> (无符号右移) |
条件运算符(三目运算符) | 布尔表达式 ? 表达式1 : 表达式2; |
字符串连接运算符 | + |
其它运算符 | instanceof new |
算术运算符
注意:一个表达式中有多个运算符,运算符有优先级,不确定或需要提高优先级的,使用括号括起来
int n1 = 20;
int n2 = 10;
System.out.println(n1 + n2); // 30
System.out.println(n1 - n2); // -10
System.out.println(n1 * n2); // 300
System.out.println(n1 / n2); // 2
System.out.println(n1 % n2); // 0
++出现在变量后,先赋值再运算
int x = 25;
int x1 = x++;
System.out.println(x1); // 25
++出现在变量前,先运算再赋值
int m = 30;
int n = ++m;
System.out.println(n); // 31
关系运算符
注意:关系运算符的结果一定是布尔值,即true/false
基本类型比较的是值,引用类型比较的是引用地址
int n1 = 20;
int n2 = 10;
System.out.println(n1 > n2); // true
System.out.println(n1 >= n2); // true
System.out.println(n1 < n2); // false
System.out.println(n1 <= n2); // false
System.out.println(n1 == n2); // false
System.out.println(n1 != n2); // true
逻辑运算符
注意:
1. 在逻辑运算符要求两边的算子都是布尔类型,并且逻辑运算符最终的运算结果也是一个布尔类型
2. 短路与和逻辑与最终的结果是相同的,只不过短路与存在短路现象
3. 短路或和逻辑或最终的结果是相同的,只不过短路或存在短路现象
& 逻辑与 -- 两边的结果都是true,结果返回true
| 逻辑或 -- 两边的结果只要有一个true,结果返回true
! 逻辑非 -- 取反,!false结果返回true. !true结果返回false
^ 两边的算子只要不一样,结果就是true
System.out.println(true & true); // true
System.out.println(true & false); // false
System.out.println(true | false); // true
System.out.println(false | false); // false
System.out.println(true ^ true); // false
System.out.println(false ^ false); // false
System.out.println(true ^ false); // true
短路与、逻辑与的区别
逻辑与(&)第一个条件是false时,继续执行执行第二个条件
int n1 = 20;
int n2 = 10;
System.out.println(n1 < n2 & n1++ < n2);
System.out.println(n1); // 21
短路与(&&)第一个条件是false时,不会再执行第二个条件,直接返回false
int n1 = 20;
int n2 = 10;
System.out.println(n1 < n2 && n1++ < n2);
System.out.println(n1); // 20
什么时候会发生短路现象?
短路与:当第一个条件结果返回false时,会发生短路与
短路或:当第一个条件结果返回true时,会发生短路或
赋值运算符
普通赋值
int num = 10;
num = num + 10; // num = 15
扩展赋值 运算符
int num = 10;
num +=10; // num = 15
以上相当于普通赋值
num -=10; // 相当于num = (int)(num - 10);
num *=10; // 相当于num = (int)(num * 10);
num /=10; // 相当于num = (int)(num / 10);
num %=10; // 相当于num = (int)(num % 10);
以下代码报错,大容量转换成小容量需要加强制类型转换符;
下面累加10没有超出byte的取值范围,但由于编译阶段编译器不会去判断具体的值,只会认为是num是int类型;
具体请看《基本类型转换规则》
报错:错误: 不兼容的类型: 从int转换到byte可能会有损失
byte num = 10;
num = num + 10;
普通赋值与扩展赋值的区别,正常编译
扩展类赋值的运算结果不改变运算结果
byte num = 10;
num += 10;
连(拼)接运算符
Java中用+号来连接两个字符串,在Java中+号有两个作用,一个是求和运算,另一个作用是连接字符串
什么时候进行求和运算?
当“+”两边的数据类型都是数字的话,那就是进行求和运算;
什么时候进行字符串连接?
当“+”两边的数据类型只要有一个是字符串类型(String)时,那就是进行字符串连接运算,并且运算出来的结果一定是字符串类型
注意:一个表达式可以有多个“+”号,在没有添加小括号的前提下,那么Java是遵守从左到右的运算;
int num = 10;
System.out.println("10"+ 10); // 1010
System.out.println(10 + num); // 20;
System.out.println(10 + 20 + "10"); // 3010
System.out.println(10 + (20 + "10")); // 102010
三元(目)运算符
格式:判断条件 ?表达式1 : 表达式2;
判断条件为true时,执行表达式1;判断条件为false时,执行表达式2
boolean sex = true;
// sex ? '男' : '女'; //报错, 必须拿一个变量来接收
char sexText = sex ? '男' : '女';
System.out.println(sexText); // 男