运算符
运算符是一种特殊的符号,用于表示数据的运算、赋值和比较等
算数运算符
算数运算符是对数值类型的变量进行运算的,常见的算数运算符有:
System.out.println(10 / 4); // 结果显示2 10和4都是整数,结果也要是整数,会把小数部分去掉
System.out.println(10.0 / 4); // 结果为2.5
double d = 10 / 4; // 结果为2.0
System.out.println(10 % 3); // 结果显示1
System.out.println(-10 % 3); // 结果显示-1
System.out.println(10 % -3); // 结果显示1
System.out.println(-10 % -3); // 结果显示-1
在
Java
中,a % b
取模的本质是a - a / b * b
// 如果独立使用++,前自增和后自增是一样的
int i = 10;
i++; // 等价于 i = i + 1
++i; // 等价于 i = i + 1
System.out.println(i); // 结果显示12
// 如果自增作为表达式使用,前++:先自增后赋值;后++:先赋值后自增
int i = 8;
int k = ++i; // k为9,i为9
int j = 8;
int h = j++; // h为8,j为9
关系运算符
关系运算符也叫比较运算符,运算结果都是boolean
类型,也就是要么是true
,要么是false
关系运算符经常用在if
结构的条件中或循环结构的条件中,常见的关系运算符有:
关系运算符组成的表达式,我们称为关系表达式
逻辑运算符
逻辑运算符是用于连接多个条件(多个关系表达式),最终的结果也是一个布尔类型
逻辑运算符有两种形式:
逻辑运算符规则:
逻辑与:
a & b
,当a
和b
同时为真时,结果为真,否则为假逻辑或:
a | b
,当a
和b
有一个为真时,结果为真,否则为假逻辑非:
!a
,取反运算,当a
为真时,结果为假短路与:
a && b
,当a
和b
同时为真时,结果为真,否则为假,如果a
为假,则b
语句将不会执行判断javaint a = 4; int b = 9; if (a < 1 && ++b < 50) { System.out.println('ok'); // 不执行 } System.out.println(a, b); // 结果显示4,9
但是对于逻辑与来说,如果
a
为假,b
语句还会进行判断:javaint a = 4; int b = 9; if (a < 1 & ++b < 50) { System.out.println('ok'); // 不执行 } System.out.println(a, b); // 结果显示4,10
短路或:
a || b
,当a
和b
有一个为真时,结果为真,否则为假,如果a
为真,则b
语句将不会执行判断但是对于逻辑或来说,如果
a
为真,b
语句还会进行判断逻辑异或:
a ^ b
,当a
和b
不同时,结果为真,否则为假
- 在开发中,基本上都是使用短路与为主,因为前一个为假,后面的就不在判断执行了,效率高
- 在开发中,基本上都是使用短路或为主,因为前一个为真,后面的就不在判断执行了,效率高
赋值运算符
赋值运算符就是将某个运算后的值,赋给指定的变量
- 基本赋值运算符
=
- 复合赋值运算符
+=
、-=
、*=
、/=
、%=
注意事项:
赋值运算符的运算顺序是从右往左
赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值
复合赋值运算符会进行类型的强制转换
javabyte b = 2; b += 3; // 等价于 b = (byte)(b + 3); b + 3的类型是int,如果没有进行类型转换是编译不了的
三元运算符
基本语法:条件表达式 ? 表达式1 : 表达式2;
如果条件表达式为true
,运算后的结果是表达式1;如果条件表达式为false
,运算后的结果是表达式2
如果执行了表达式1,那么表达式2是不会执行的,反之同理
注意事项:
表达式1和表达式2要为可以赋给接收变量的类型(或可以进行自动转换)
javaint a = 3; int b = 4; int c = a > b ? 1.1 : 3.4; // 报错,编译不通过,double类型不能赋值给int类型 double d = a > b ? a ; b; // 不会报错,可以进行自动的类型转换,int类型可以自动转化到double类型
位运算符
计算机内部处理信息都是采用二进制数来表示
原码、反码和补码的概念:
对于有符号的数而言,有以下的八个规则(要背下来):
- 二进制的最高位是符号位:0表示正数;1表示负数
- 正数的原码、反码和补码都一样
- 负数的反码=它的原码符号位不变,其他位取反
- 负数的补码=它的反码+1; 负数的反码=负数的补码-1
- 0的反码、补码都是0
Java
没有无符号数,也就是说Java
中的数都是有符号的- 在计算机运算的时候,都是以补码的方式进行运算的(补码可以解决正数和负数)
- 当我们看运算结果的时候,要看他的原码
常见的位运算符有:位运算符的使用,先将两边的值先全部转成二进制,再得到这个二进制的补码,最后参与运算,运算后的结果先转回二进制的原码,再转回十进制
~
按位取反:0变1,1变0~-2的运算过程:
~2的运算过程:
&
按位与:两位全为1,结果为1,否则为02 & 3的运算过程:由于是
int
类型,占4个字节|
按位或:两位有一个为1,结果为1,否则为0^
按位异或:两位一个为0一个为1,结果为1,否则为0>>
算数右移:低位溢出,符号位不变,并用符号位补溢出的高位1 >> 2;
结果为0,表示将十进制的1先转为二进制,再向右位移两位,本质就是1/2/2
<<
算数左移:符号位不变,低位补0``1 << 2;
结果为4,表示将十进制的1先转为二进制,再向左位移两位,本质是
122`>>>
无符号右移:低位溢出,高位补0
运算符的优先级
运算符有不同的优先级,下图中的运算符优先级从高到低依次为:
只有单目运算符、赋值运算符是从右往左的,其他运算符都是从左到右的
优先级由高到低大致优先级分类为括号、单目运算符、算数运算符、位移运算符、比较运算符、逻辑运算符、三元运算符、赋值运算符