Skip to content

运算符


类型介绍

(1)算数运算符

(2)赋值运算符

(3)关系运算符(比较运算符)

(4)逻辑运算符

(5)三元运算符

(6)位运算符(需要二进制基础)


一、算数运算符

基本介绍

运算符计算范例结果
+正号+77
-负号b=11; -b-11
+加法9+918
-减法10-82
*乘法7*856
/除法9/91
%取模(取余)11%92
++自增(前)a=2;b=b++;aa=3; b=2
++自增(后)a=2;b=++a;a=3; b=3
--自减(前)a=2;b=b--;aa=2; b=1
--自减(后)a=2;b=--a;a=1; b=1
+字符串拼接"hsp"+"edu""hspedu"

使用细节

(1)a++:先用后加

(2)++a:先加后用

(3)/:除法的结果取决于左右操作数,如果都是整数,结果就是整数,例如:8/5=1

(4) %:取模的本质是 a % b = a - a / b * b

-10 % 3 = -10 - (-10) / 3 * 3 = -10 + 9 = -1

10 % -3 = 10 - 10 / (-3) * (-3) = 10 - 9 = 1

-10 % -3 = (-10) - (-10) / (-3) * (-3) = -10 + 9 = -1

(5) 自增、自减运算符的底层本质

自增或者自减后,该结果会采用一个临时变量保存,然后给变量重新赋值

随堂练习

面试题一

java
int i = 1;
i = ++i; // 规则使用临时变量: (1) i = i + 1; (2) temp = i; (3) i = temp;
System.out.println(i); // 2

面试题二

java
int i = 1; // i -> 1
i = i++; // 规则使用临时变量: (1) temp = i; (2) i = i + 1; (3) i = temp;
System.out.println(i); // 1

二、赋值运算符

基本介绍

注意是从右往左运算,把某个值赋给变量

运算符名称说明
=赋值运算符将右边的值赋给左边的变量
+=加法赋值运算符将右边的值加到左边的变量上
-=减法赋值运算符将右边的值从左边的变量中减去
*=乘法赋值运算符将右边的值与左边的变量相乘
/=除法赋值运算符将左边的变量除以右边的值
%=取余赋值运算符将左边的变量对右边的值取余并赋值

使用细节

赋值运算符在底层会自动进行类型转换

java
byte b = 2;
b += 3;
b++;

底层实际是 b =(byte)(b+3)

如果写成 b=b+3 必然报错,int 类型不可以赋值给 byte 类型


三、关系运算符

关系运算符的返回结果都是 boolean 型,要么是 true,要么是 false

运算符计算范例结果
==相等于8 == 7false
!=不等于8 != 7true
<小于8 < 7false
>大于8 > 7true
<=小于等于8 <= 7false
>=大于等于8 >= 7true
instanceof检查是否是类的对象"hsp" instanceof Stringtrue

四、逻辑运算符

基本介绍

运算符类型说明
&逻辑与位运算中的按位与,两个操作数逐位比较,均为 1 时结果为 1
&&短路与短路与,只有两个操作数都为 true 时结果才为 true
|逻辑或位运算中的按位或,只要有一个为 1 结果为 1
||短路或短路或,只要有一个为 true,结果为 true
!a逻辑非逻辑非,取反操作
a ^ b逻辑异或逻辑异或,两个操作数不同时结果为 true

举例说明

(1)a & b: 逻辑与:当 a 和 b 同时为 true,则结果为 true,否则为 false

(2)a && b: 逻辑与:&& 短路运算:当 a 和 b 同时为 true,则结果为 true,否则为 false

(3)a | b: 逻辑或:当 a 和 b, 有一个为 true,则结果为 true,否则为 false

(4)a || b: 逻辑或:|| 短路运算:当 a 和 b, 有一个为 true,则结果为 true,否则为 false

(5)!a: 取反:或者非运算。当 a 为 true,则结果为 false,当 a 为 false,则结果为 true

(6)a ^ b: 逻辑异或:当 a 和 b 不同时,则结果为 true,否则为 false

使用细节

(1)区别 & 和 &&

& 逻辑与:不管第一个条件是否为 false,第二个条件都要判断,效率低。

&& 短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为 false,效率高。

(2)区别 | 和 ||

| 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低。

|| 短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true,效率高。

小结

(1)逻辑与、逻辑非,在条件成立会继续判断后面的条件

(2)短路与、短路或,在条件成立不会继续判断后面的条件


五、三元运算符

基本介绍

java
int res=a > b ? a++ : --b;

解释:如果条件成立,执行结果 a,如果条件不成立,执行结果 b

本质是 if - else 结构

java
if(a > b){
  res = a;
}
else{
  res = b;
}

使用细节

数据类型转换问题,高精度的数据类型不可以赋值给低精度的数据类新

代码示例

java
public class TernaryOperatorDetail {
    public static void main(String[] args) {
        // 表达式 1 和表达式 2 要为可以赋给接收变量的类型
        // (或可以自动转换/或者强制转换)
        int a = 3;
        int b = 8;

        // 使用三元运算符进行赋值
        int c = a > b ? (int) 1.1 : (int) 3.4; // 强制转换成 int 类型
        System.out.println("c = " + c); // 输出 c 的值

        double d = a > b ? a : b + 3; // 可以的,满足 int -> double 自动类型转换
        System.out.println("d = " + d); // 输出 d 的值
    }
}

六、运算符优先级

优先级运算符描述结合方向
1() [] .括号、数组下标、成员访问左到右
2++ -- + - ~ !单目运算符(前置)、正负号、逻辑非右到左
3* / %乘、除、取模左到右
4+ -加法、减法左到右
5<< >> >>>左移、右移、无符号右移左到右
6< <= > >= instanceof比较、小于等左到右
7== !=等于、不等于左到右
8&按位与左到右
9^按位异或左到右
10|按位或左到右
11&&逻辑与左到右
12||逻辑或左到右
13?:条件(三元)运算符右到左
14= += -= *= /= %=赋值及复合赋值运算符右到左
&= ^= |= <<= >>= >>>=赋值及复合赋值运算符右到左
15-> ::Lambda 和 方法引用左到右

结合方向:表示多个相同优先级的运算符出现时,按哪个方向结合

例如:a - b + c 是左结合,即 ((a - b) + c)