算术运算符
// + - * / %
//int/int结果还是int
int a = 1;
int b = 2;
System.out.println(a / b);
//结果为0,要想得到小数需要double类型
//0不能作为除数,会出现编译错误
// %表示取余,不仅仅可以对int求模,也能对double求模
System.out.println(11.5 % 2.0);
//增量赋值运算符
// += -= *= /= %=
int a = 10;
a += 1; //等价于a = a + 1
System.out.println(a);
//自增/自减运算符
// ++ --
int a = 10;
int b = ++a;
System.out.println(b);
int c = a++;
System.out.println(c);
//如果不取自增运算的表达式的返回值,则前置自增和后置自增没有区别
//如果取表达式的返回值,则前置自增的返回值是自增之后的值,后置自增的返回值是自增之前的值
关系运算符
// == != < > <= >=
int a = 10;
int b = 20;
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
//需要注意的是,关系运算符的表达式的返回值都是boolean类型
逻辑运算符
逻辑与 &&
两个操作数都为true,结果为true,否则结果为false
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b && b <c);
逻辑或 | |
两个操作数都为false,结果为false,否则结果为true
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b || b <c);
逻辑非 !
操作数为true,结果为false,操作数为false,结果为true(单目运算符,只有一个操作数)
int a = 10;
int b = 20;
int c = 30;
System.out.println(!a < b);
短路求值
对于&&,如果左侧表达式值为false,则表达式的整体值一定是false,无需计算右侧表达式
对于||,如果左侧表达式的值为true,则表达式的整体值一定是true,无需计算右侧表达式
System.out.println(10 > 20 && 10 / 0 == 0);
//打印false
System.out.println(10 < 20 || 10 / 0 == 0);
//打印true
位运算符
按位与 &
如果两个二进制位都是1,则结果为1,否则结果为0
int a = 10;
int b = 20;
System.out.println(a & b);
//按二进制位运算,需要先把10和20转成二进制,分别为01010 和 10100
按位或 |
如果两个二进制位都是0,则结果为0,否则结果为1
int a = 10;
int b = 20;
System.out.println(a | b);
//与按位与运算类似
//当&和|的操作数为整数的时候,表示按位运算,当操作数为boolean的时候,表示逻辑运算
按位取反 ~
如果该二进制位为0则转为1,如果为1则转为0
int a = 0xf;
System.out.println("%x\n",~a);
//0x表示十六进制数字,0表示八进制数字
按位异或 ^
如果两个数字的二进制位相同则结果为0,相异则结果为1
int a = 0x1;
int b = 0x2;
System.out.println("%x\n",a ^ b);
移位运算符
//左移 <<
//最左侧位不要了,最右侧补0
//右移 >>
//最右侧位不要了,最左侧补符号位(正数补0,负数补1)
//无符号右移 >>>
//最右侧位不要了,最左侧补0
左移1位,相当于原数字2,左移N位,相当于原数字2的N次方
右移1位,相当于原数字/2,右移N位,相当于原数字/2的N次方
条件运算符
条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3
是Java中唯一一个三目运算符,是条件判断语句的简化写法
//求两个数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;