本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Java中使用的运算符有算术运算符、关系运算符、逻辑运算符、位运算符、移位运算符、条件运算符等。
@[TOC]
一、算术运算符
算术运算符和他们在数学里起到的作用是一样的。
//基本四则运算
c = a + b; // “+”加法:左右操作数相加
c = a - b; // "-"减法:左操作数减右操作数
c = a * b; // “*”乘法:左右操作数相乘
c = a / b; // “/”除法:左操作数除以右操作数
c = a % b; // “%”取余:左操作数除以右操作数得到其余数
//自增/自减运算
a++; // 自增:操作数值加1
b--; // 自减:操作数值减1
//增量运算符
a += b; // 该式等价于 “a = a + b” 下同
a -= b;
a *= b;
a /= b;
a %= b;
注:
- 自增自减操作还包括
--a以及++a前置操作符的用法。操作符后置为先用再修改,操作符前置为先修改再用; - 除法和取余操作时,右操作数不能为0。
int a = 20;
int b = 10;
int c = 0;
c = a + b; // c = 30
c = a - b; // c = 10
c = a * b; // c = 200
c = a / b; // c = 2
c = a % b; // c = 0
a++; // a = 21
b--; // b = 9
a += b; //a = 30
二、关系运算符
a == b; // 判断a与b是否相等,相等则条件为真
a != b; // 判断a与b是否不等,不等则条件为真
a > b; // 判断a是否大于b,大于则条件为真
a < b; // 判断a是否小于b,小于则条件为真
a >= b; // 判断a是否大于等于b,大于等于则条件为真
a <= b; // 判断a是否小于等于b,小于等于则条件为真
int a = 10;
int b = 20;
a == b; // false
a != b; // true
a > b; // false
a < b; // true
b >= a; // true
b <= a; // false
三、逻辑运算符
逻辑运算符有三个&&、||、!,运算结果都是boolean类型。
1、逻辑与运算(&&)
有假为假,全真为真。
int a = 10;
int b = 20;
a == 10 && b == 20; // 真 && 真 => 真
a == 10 && b > 100; // 真 && 假 => 假
a > 100 && b == 20; // 假 && 真 => 假
a > 100 && b > 100; // 假 && 假 => 假
2、逻辑或运算(&&)
有真为真,全假为假。
int a = 10;
int b = 20;
a == 10 || b == 20; // 真 && 真 => 真
a == 10 || b > 100; // 真 && 假 => 真
a > 100 || b == 20; // 假 && 真 => 真
a > 100 || b > 100; // 假 && 假 => 假
3、逻辑非运算(!)
真假互换。
int a = 10;
!(a == 10); // !(假) => 真
!(a != 10); // !(真) => 假
4、短路逻辑运算符
&&和||遵守短路求值的规则,当使用&&和||时,两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。
System.out.println(10 > 20 && 10 / 0 == 0); // false,&&左侧结果为false,则无需计算右侧
System.out.println(10 < 20 || 10 / 0 == 0); // true,||左侧结果为true,则无需计算右侧
注: 上述逻辑运算符右侧 10/0是会造成程序异常的,但是却正常运行了,因为它们符合短路求值规则。&和|如果表达式结果为boolean时,也表示逻辑运算,但不遵守短路规则,会抛出异常。
四、位运算符
可以进行数据操作的最小单位是比特。位操作数按照二进制位进行运算,位运算符包括:
- 一元运算符:
~ - 二元运算符:
&、|、^、<<、<<、>>>
1、按位与(&)
全1为1,有0为0
int a = 10;
int b = 20;
System.out.println(a & b); // 0000 0000
2、按位或(|)
全0为0,有1为1
int a = 10;
int b = 20;
System.out.println(a | b); // 0001 1110
注:
&和|操作数为boolean类型时,表示逻辑运算。
3、按位取反(~)
0变为1,1变为0
int a = 0x0;
System.out.printf("%x\n", ~a) // ffff
注: 0x表示十六进制数字。%x表示十六进制输出。
4、按位异或(^)
相同为0,相异为1
int a = 0xf;
int b = 0xf;
System.out.printf("%x\n", a ^ b); // 0
int a = 0x10;
int b = 0x20;
System.out.printf("%x\n", a ^ b); // 0001 1110 = 30
5、按位左移
最左侧一位舍弃,最右侧补0。
int a = 60; // 60 = 0011 1100
c = a << 2; // 240 = 1111 0000
System.out.println("a << 2 = " + c );
注: 左移1位相当于原数字乘2。
6、按位右移
最右侧位舍弃,最左侧补符号位(==正数补0,负数补1==)
int a = 60; // 60 = 0011 1100
c = a >> 2; // 15 = 1111
System.out.println("a >> 2 = " + c );
示例:
public static void main(String[] args) {
int a = 10;
int b = 20;
int avg = b + ((a-b)>>1); // 用于求平均值
System.out.println(a+"和"+b+"的平均值为:"+avg);
//a和b相加可能会导致超出溢出,示例中并未溢出。且除法效率低下。
}
7、无符号右移
最右侧位舍弃,最左侧补0
int a = 60; // 60 = 0011 1100
c = a >>> 2; // 15 = 0000 1111
System.out.println("a >>> 2 = " + c );
注: 右移1位相当于原数字除2。
五、条件运算符
条件运算符也叫三元运算符。该运算符有3个操作数,并且需要判断boolean表达式的值。该运算符的主要是决定哪个值应该赋值给变量。条件运算符格式:A ? B : C
当A为true时,整个表达式为B的值。
当A为false时,整个表达式为C的值。
int a , b;
a = 10;
// 如果 a 等于 1 成立,则设置 b 为 20,否则为 30
b = (a == 1) ? 20 : 30;
System.out.println( "Value of b is : " + b );
// 如果 a 等于 10 成立,则设置 b 为 20,否则为 30
b = (a == 10) ? 20 : 30;
System.out.println( "Value of b is : " + b );
表达式不能单独存在,产生的结果要被使用,否则会报错
int a = 10;
int b = 20;
a > b? a : b; //会报错
==注:== 最后要注意的一点是,运算符都是有其优先级的,在有歧义的表达式上一定要注意带括号,避免歧义。