Java 运算符笔记
1.算术运算符
- +:加法运算符
- -:减法运算符
- *:乘法运算符
- /:除法运算符
- %:取余运算符(取模运算符)
// 推荐使用此方式,分别定义
int i3 = 3;
int i4 = 4;
// 2.使用上述变量实现算术运算符的使用
// i1,i2叫做操作数,i1 + i2叫做表达式,+叫做操作符或表达式
int result = i1 + i2;
System.out.println("i1 + i2 = " + result);
System.out.println("i1 + i2 = " + (i1 + i2));
2.算术运算符注意事项
-
当两个整数相除时,保留整数部分,丢弃小数部分
-
System.out.println("5 / 2 = " + (5 / 2)); // 2
-
-
如果想要保留小数部分,有两种方式
-
处理方式一:数据类型强制转换
System.out.println("5 / 2 = " + ((double)5 / 2)); // 2.5 System.out.println("5 / 2 = " + (5 / (double)2)); // 2.5 System.out.println("5 / 2 = " + ((double)5 / (double)2)); // 2.5
-
处理方式二:乘以一个double类型的数,比如说1.0
System.out.println("5 / 2 = " + (1.0 * 5 / 2)); // 2.5
-
-
0不能做除数,0.0可以做除数,效果不同
-
System.out.println("5 / 0 = " + (5 / 0)); // java.lang.ArithmeticException(算术异常): / by zero System.out.println("5 / 0.0 = " + (5 / 0.0)); // 5 / 0.0 = Infinity,无穷 System.out.println("0 / 0.0 = " + (0 / 0.0)); // 0 / 0.0 = NaN, not a number
-
3.+的两重含义:
- 加法运算符
- 字符串连接符
- 将字符串与不同类型的数据连接起来,最后结果是一个字符串
- +两边如果有字符串,就是字符串连接符
4.关系运算符(比较运算符)
- 大于,大于等于
- 小于,小于等于
- ==
- !=
所有以关系运算符作为最终运算的表达式结果一定是boolean类型
5.自增减运算符
- ++(自增运算符)
- 只需要一个操作数,使当前值加一
- – (自减运算符)
- 只需要一个操作数,使当前值减一
只能用于变量,不能用于常量
6.逻辑运算符
- &&(逻辑与运算符)
- 同真为真,一假为假
- || (逻辑或运算符)
- 一真为真,同假为假
- !(逻辑非运算符)
- 取反,真为假,假为真
逻辑运算符两边的操作数必须是boolean表达式
短路特性:
- 对于逻辑与运算符来说,若第一个表达式为假则结果为假,此时跳过第二个表达式;
- 对于逻辑或运算符来说,若第一个表达式为真则结果为真,此时跳过第二个表达式;
逻辑运算符主要用于连接多个关系运算符作为最终运算的表达式,用于实现多个条件的连接
7.三目运算符(条件运算符)
-
条件表达式? 表达式1: 表达式2
-
判断条件表达式是否成立,若成立则执行表达式1,否则执行表达式2 。
// 3.使用三目运算符判断是否为三位数 System.out.println("100 <= num && num <= 999: " + ((100 <= num && num <= 999)? true:false));
8.赋值运算符
- =
- 将=右边的变量的值赋值给左边的变量,并覆盖左边变量的值
- 赋值表达式本身也有值,其本身之值即为所赋之值
- 复合赋值运算符
- +=,-=,*=,/=,……
考点总结:
-
+=和常规加法不完全相同
-
// 5.1 +=和常规加法不完全相同 byte i3 = 10; System.out.println("i3 = " + i3); // byte + int 结果为 int // i3 = i3 + 2; // 错误: 不兼容的类型: 从int转换到byte可能会有损失 // byte + byte 结果为 int,编译器优化,因为byte范围小,提升为int类型,减少高位溢出的问题 // i3 = i3 + (byte)2; // 错误: 不兼容的类型: 从int转换到byte可能会有损失 System.out.println("i3 = " + i3); i3 += 2; // 等价于 i3 = (byte)(i3 + 2) System.out.println("i3 = " + i3);
-
9.移位运算符
-
<<(左移运算符)
- 用于将数据的二进制位向左移动,右边用0补充
- 左移一位相当于整数乘以2,左移两位相当于整数乘以4,以此类推
-
>> (右移运算符)
- 用于将数据的二进制位向右移动,左边用符号位补充
- 右移一位相当于整数除以2,右移两位相当于整数除以4,以此类推
- 当原来的整数是偶数时,会直接乘或除以2
- 当原来的整数是奇数时,无论正负,结果会向下取整
-
>>>(逻辑右移运算符,无符号右移)
-
用于向数据的二进制位向右移动,左边使用0补充
-
当整数为正数时,右移运算和逻辑右移运算是一样的
-
当整数是负数时,结果是-2046483748除以移动的位数,然后减去整数除以2的移位次方
-
10.位运算符
- &:(按位与运算符)
- 按照二进制位对应关系,同一为一,有零为零
- |:(按位或运算符)
- 按照二进制位进行或运算,有一为一,同零为零
- ~:(按位取反运算符)
- 按照二进制位进行取反,一为零,零为一
- ^:(按位异或运算符)
- 按照二进制位进行异或运算,相同为零,不同为一
案例:
// 1.声明两个byte类型的变量并初始化
byte b1 = 11;
byte b2 = 13;
// 3.实现位运算符的使用
// b1: 00001011
// b2: 00001101
System.out.println("(b1 & b2): " + (b1 & b2)); // 00001001 -> 9
System.out.println("(b1 | b2): " + (b1 | b2)); // 00001111 -> 15
System.out.println("(b1 ^ b2): " + (b1 ^ b2)); // 00000110 -> 6
System.out.println("(~ b1): " + (~ b1)); // 11110100 -> 11110011 -> 00001100 -> -12
System.out.println("(~ b2): " + (~ b2)); // 11110010 -> 11110001 -> 00001110 -> -14
11.运算符的优先级
-
从上到下优先级依次降低
-
一元运算:只需要一个操作数(正负号)
int m = 1;
int n = 0;
n = m+++m++;
System.out.println(m); // 3
System.out.println(n); // 3
m = 1;
System.out.println(m+++m++); // 3
System.out.println(m); // 3
System.out.println("=============================");
m = 1;
n = ++m+m+++m;
System.out.println(m); // 3
System.out.println(n); // 7
m = 1;
System.out.println(++m+m+++m); // 7
System.out.println(m); // 3
System.out.println("=============================");
m = 1;
n = ++m+m+++m++;
System.out.println(m); // 4
System.out.println(n); // 7
m = 1;
System.out.println(++m+m+++m++); // 7
System.out.println(m); // 4
System.out.println("=============================");
m = 1;
n = (++m)+(m++)+(m++);
System.out.println(m); // 4
System.out.println(n); // 7
m = 1;
System.out.println(++m+m+++m++); // 7
System.out.println(m); // 4
System.out.println("=============================");
反例:
int m = 1;
int n = 0;
//n = ++m+m+++++m;
//n = ++++m;
//n = ++(++m);
//n = m++++;
//n = (m++)++;
System.out.println(m); // 3
System.out.println(n); // 3