基本运算符
运算符
Java语言支持如下运算符:
-
算数运算符:+,-,*,/,%,++,–
-
赋值运算符:=
-
关系运算符:>,<,>=,<=,==,!=,instanceof
-
逻辑运算符:&&,||,!
-
位运算符:&,|,……,~,>>,<<,>>>(了解就行)
-
条件运算符: ?:(了解)
-
扩展赋值运算符:+=,-=,*=,/=(了解)
算术运算
算术运算可以是多元运算,为方便起见,下面我们用二元运算来演示:
// 快捷键 Ctrl + D : 复制当前行到下一行
int a = 10;
int b = 20;
System.out.println(a+b); // 30
System.out.println(a-b); // -10
System.out.println(a*b); // 200
System.out.println(a/b); // 0 因为 a 和 b 都是整数类型,所以结果也会取整
System.out.println(a/(double)b); // 0.5 可以通过类型转换来解决程序自动取整问题
byte c = 30;
short d = 40;
long e = 50;
int f = 60;
// 特别的, 不同类型数据之间相加减时,会出现结果类型转换的现象
System.out.println(c+d+e); // 120 当操作数中存在long类型操作数,结果就会转换为long类型
System.out.println(c+d); // 70 若操作数中不存在long类型操作数,结果则转换为int类型
System.out.println((long)(d+f)); // 100 即使是算术运算的结果,也可以通过强制转换,来 改变结果的数据类型
// 同理,其他情况的结果也都是向最高级别的操作数的数据类型转换
- % 是取余运算,结果只保留余数,也叫模运算(二元运算符)
int a = 21;
int b = 10;
System.out.println(a%b); // 1 21除10商2余1,所以运算结果即为1
- ++是自增运算,- -是自减运算,例如x++,可以理解为x=x+1,同理,x- -就是x=x-1(一元运算符),自减运算的符号位置是会影响运算的,看下面的实例演示:
int a = 1;
int b = 1;
System.out.println(a++); // 1 自增运算符在操作数的后面,此时是先用a的本身,再执行自增运算,自增运算的结果不会在本条语句中呈现
System.out.println(a); // 2 自增运算结束,再查看a的值时,可以发现a自身已经加1了
System.out.println(b); // 1
System.out.println(++b); // 2 自增运算符在操作数的前面,此时是先执行自增运算,再使用b,所以在这条语句的执行结果中可以看到b自身加1了
// 自减运算同理
关系运算
关系运算符的返回结果是布尔值,只有两种:true、false
a > b
若 a 大于 b 返回true,否则false
a < b
若 a 小于 b 返回true,否则false
a >= b
若 a 大于等于 b 返回true,否则false
a <= b
若 a 小于等于 b 返回true,否则false
a == b
若 a 等于 b 返回true,否则false
注意,=是赋值运算符,==才是判断两侧是否相等的关系运算符
a != b
若 a 不等于 b 返回true,否则false
实例演示:
// 关系运算符返回的结果:正确,错误 布尔值
// if
int a = 10;
int b = 20;
System.out.println(a>b); // false
System.out.println(a<b); // true
System.out.println(a==b); // false
System.out.println(a!=b); // true
逻辑运算
逻辑运算符,有三种操作,与(二元运算符)、或(二元运算符)、非(一元运算符)
返回结果类型是布尔值类型,true 和 false
a && b
:“与”操作,只有 a 和 b 都为真时,结果为true,否则为false
a || b
:“或”操作,a 和 b 只要有一个为真,结果即为真,只有 a 和 b 都为假时,结果才为false。
!a
:“非”操作,若 a 为假,返回true,若 a 为真,返回false
boolean a = false;
boolean b = true;
boolean c = false;
boolean d = true;
System.out.println(a && b); // false
System.out.println(b && d); // true
System.out.println(b || c); // true
System.out.println(a || c); // false
System.out.println(!a); // true
System.out.println(!b); // false
逻辑运算是一种短路运算:
-
执行“与”操作时,只要第一个操作数为假,就会跳过对第二个操作数的判定过程,直接返回false
-
执行“或”操作时,只要第一个操作数为真,就会跳过对第二个操作数的判定过程,直接返回true
int a = 10;
boolean b = (a>10)&&(a++>10); // 显然,第一个操作数为假
System.out.println(b); // false
System.out.println(a); // 10 a的值不变,是因为在 b 的赋值语句中,a++跳过未执行
位运算符
位运算很好理解,就是对应位置上的逻辑运算
假设(接下来的赋值操作都写成了二进制形式,实际赋值肯定不会这样写,这样写是为了便于演示):
A = 0011 1100
A 是一个二进制数
B = 0000 1101
B 是一个二进制数
C = 0000 0010
C 是一个二进制数,值为2
那么:
A&B = 0000 1100
对应位置都是1,结果才为1,否则为0
A|B = 0011 1101
对应位置都是0,结果才为0,否则为1
A^B = 0011 0001
对应位置相同,结果为0,不同则为1
~B = 1111 0010
对应位置取反
C<<3 = 0001 0000
C 的位置向左移动3位,值变成了16
C>>2 = 0000 0100
C 的位置向右移动2位,值变成了8
可以理解为,a << x
就是 a 乘了 x 个 2,a >> x
就是 a 除了 x 个2
在很多算法里面,可以用位运算做一些很精巧的操作,因为位运算效率非常高,它是直接与计算机底层(二进制)打交道的
<< 和 >> 运算要死死记住,这两个常用的位运算对我们来说是很有必要的
条件运算
条件运算是一种三元运算
x ? y : z
若x为真,则y,否则为z
实例演示:
boolean flag = true;
int score = 80;
String yes = "及格";
String no = "不及格";
if(score<60) flag=false;
System.out.println(flag ? yes : no); // 及格 因为80>60,所以flag依然为真,条件运算选择输出yes的值
扩展赋值运算
这是一种偷懒运算
a+=b
a = a+b
a-=b
a = a-b
a*=b
a = a*b
a/=b
a = a/b
字符串连接符
+
在某些特定的情况下,可以作为字符串连接符
实例:
int a = 10;
int b = 20;
System.out.println(""+a+b);
/* 1020 显然,这个结果是把 a 和 b 作为字符串连接起来
了,这是因为在本次运算的最开始,有一个空字符串参与了运
算,使空字符后面的运算都变成了字符串之间的连接操作 */
System.out.println(a+b+"");
/* 30 这里是先把 a 和 b 相加后再转换为字符串,这是因
为 + 作为字符串连接符是从算式中出现字符串开始的,而 a 和 b 是在空
字符串之前出现的,所以还是按照基本算术运算的规则被操作 */