运算符
一、算数运算符
1、基本运算符
1)加法(+)
int a = 10;
int b = 10;
System.out.println(a+b);
//结果为
20
int a = 10;
double b = 1.2;
System.out.println(a+b);//自动将 int 类型的a提为 double 类型然后在运算(范围小的提升为范围大的)
//结果为
11.2
2)减法(-)
int a = 15;
int b = 10;
System.out.println(a-b);
//结果为
5
int a = 10;
double b = 1.2;
System.out.println(a-b);
//结果为
8.8
3)乘法(*)
int a = 10;
int b = 10;
System.out.println(a*b);
//结果为
100
int a = 10;
double b = 1.2;
System.out.println(a*b);
//结果为
12
4)除法(/)
注意1 : 除法当中除数是不能为 0 的
而当除数为0时编译能通过,但是运行会出错
例如:
int a = 10;
int b = 0;
System.out.println(a/b);
//结果为
Exception in thread "main" java.lang.ArithmeticException: / by zero
at test.main(test.java:14)
ArithmeticException算术异常
注意2 : 如果除数和被除数都为整型,则可能会出现精度丢失
例如:
int a = 1;
int b = 2;
System.out.println(a/b);
//结果为
0
5)取余(%)
取余就是被除数除以除数等于商加余数
被除数 / 除数 = 商 + 余数
余数就是取余的结果
例子1
int a = -10;
int b = 3;
System.out.println(a%b);
//结果为
-1
原因:-10 = 3 *( - 3 ) + (-1)
例子2
double a = 12.5;
int b = 2;
System.out.println(a%b);
//结果为
0.5
原因:12.5 = 2 * 6 + 0.5
2、增量赋值运算符
1)+=
a += 10;
a = a +10;
2)-=
a -= 10;
a = a -10;
3)*=
a *= 10;
a = a *10;
4)/=
a /= 10;
a = a /10;
5)%=
a %= 10;
a = a %10;
3、自增/自减运算符
1)自增(++)
int a = 10;
a = a++;//先赋值在自增
System.out.println(a);
a = ++a;//先自增在赋值
System.out.println(a);
//结果为
10
11
2)自减(–)
int a = 10;
a = a--;//先赋值在自增
System.out.println(a);
a = --a;//先自增在赋值
System.out.println(a);
//结果为
10
9
二、关系运算符
关系运算符的表达式返回值都是 boolean 类型(即返回值结果是 true 或 false )
1)等于(==)
int a = 10;
int b = 20;
System.out.println(a == b);
//结果为
false
2)不等于(!=)
int a = 10;
int b = 20;
System.out.println(a != b);
//结果为
true
3)小于(<)
int a = 10;
int b = 20;
System.out.println(a < b);
//结果为
true
注意:当 10 < 10 时,结果为 false
int a = 10;
int b = 10;
System.out.println(a < b);
//结果为
false
4)小于等于(<=)
int a = 10;
int b = 10;
System.out.println(a <= b);
//结果为
true
5)大于(>)
int a = 10;
int b = 20;
System.out.println(a > b);
//结果为
false
注意:当 10 > 10 时,结果为 false
int a = 10;
int b = 10;
System.out.println(a > b);
//结果为
false
6)大于等于(>=)
int a = 10;
int b = 10;
System.out.println(a >= b);
//结果为
true
三、逻辑运算符
逻辑运算符的操作数和返回值都是 boolean 类型
1、逻辑与(&&)
两个操作数都是 true ,结果为 true ,否则为 false
表达式1 && 表达式2
表达式1为 true 执行表达式2;表达式2为 true ,结果为 true ,表达式2为 false ,结果为 false
表达式1为 false 不执行表达式2,结果为 false
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b && b < c);
//结果为
true
2、逻辑或( || )
两个操作数都是false ,结果为 false ,否则为 true
表达式1 && 表达式2
表达式1为 false 执行表达式2,表达式2为 true ,结果为 true ,表达式2为 false ,结果为 false
表达式1为 true 不执行表达式,结果为 true
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b || b < a);
//结果为
true
3、逻辑非( !)
只有一个操作数,操作数为 true ,结果为 false ; 操作数为 false , 结果为 true;
int a = 10;
int b = 20;
System.out.println(!a < b);
//结果为
false
4、短路求值
&& 和 || 遵守短路求值的规则.
System.out.println(10 > 20 && 10 / 0 ==0); // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
计算 10 / 0 会导致程序抛出异常. 但是上面的代码却能正常运行, 说明 10 / 0 并没有真正被求值.
结论:
- 对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式.
- 对于 ||, 如果左侧表达式值为 true, 则表达式的整体的值一定是 true, 无需计算右侧表达式.
四、位运算符
Java 中对数据的操作的最小单位不是字节, 而是二进制位.
位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算.
1、按位与( & )
对应二进制位上都为 1 ,则为 1 ;都为 0 ,则为 0 ;不相同,也为 0
int a = 10;
int b = 20;
System.out.println(a & b);
//结果为
0
进行按位运算, 需要先把 10 和 20 转成二进制, 分别为 1010 和 10100
2、按位或( | )
对应二进制位上若有 1 ,则为 1 ;都为 0 ,则为 0
int a = 13;
int b = 11;
System.out.println(a | b);
//结果为
15
进行按位运算, 需要先把 13 和 11 转成二进制, 分别为 1101 和 1011
注意:
当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算.
3、按位异或( ^ )
二进制对应位上一样则为 0 ,不一样则为 1
int a = 13;
int b = 11;
System.out.println(a ^ b);
//结果为
6
.
4、按位取反(~)
如果该位为 0 则转为 1, 如果该位为 1 则转为 0
int a = 0xf;
System.out.printf("%x\n", ~a)
//结果为
fffffff0
注意:
- 0x 前缀的数字为 十六进制数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4 个二进制位.
- 0xf 表示 10 进制的 15, 也就是二进制的 1111
- printf 能够格式化输出内容, %x 表示按照十六进制输出.
- \n 表示换行符
五、移位运算符
按照二进制位来运算
1、左移( << )
最左侧位不要了, 最右侧补 0
int a = 0x10;
System.out.printf("%x\n", a << 1);
// 运行结果(注意, 是按十六进制打印的)
20
2、右移( >> )
最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
int a = 0x10;
System.out.printf("%x\n", a >> 1);
// 运行结果(注意, 是按十六进制打印的)
8
int b = 0xffff0000;
System.out.printf("%x\n", b >> 1);
// 运行结果(注意, 是按十六进制打印的)
ffff8000
3、无符号右移( >>> )
最右侧位不要了, 最左侧补 0.
int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
// 运行结果(注意, 是按十六进制打印的)
7fffffff
注意:
- 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
- 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
- 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
- 移动负数位或者移位位数过大都没有意义.
六、条件运算符
条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值; 当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.
也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法.
int a = 10;
int b = 20;
System.out.println(a > b ? a : b);// a > b 为真,打印 a 的值, a > b 为假,打印 b 的值
//结果为
20