Skip to content

运算符

运算符是一种特殊的符号,用于表示数据的运算、赋值和比较等

算数运算符

算数运算符是对数值类型的变量进行运算的,常见的算数运算符有:

image-20250316101219733

java
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

java
// 如果独立使用++,前自增和后自增是一样的
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结构的条件中或循环结构的条件中,常见的关系运算符有:

image-20250316110533527

关系运算符组成的表达式,我们称为关系表达式


逻辑运算符

逻辑运算符是用于连接多个条件(多个关系表达式),最终的结果也是一个布尔类型

逻辑运算符有两种形式:

image-20250316111346482

逻辑运算符规则:

  • 逻辑与:a & b,当ab同时为真时,结果为真,否则为假

  • 逻辑或:a | b,当ab有一个为真时,结果为真,否则为假

  • 逻辑非:!a,取反运算,当a为真时,结果为假

  • 短路与:a && b,当ab同时为真时,结果为真,否则为假,如果a为假,则b语句将不会执行判断

    java
    int a = 4;
    int b = 9;
    if (a < 1 && ++b < 50) {
        System.out.println('ok');    // 不执行
    }
    System.out.println(a, b);   // 结果显示4,9

    但是对于逻辑与来说,如果a为假,b语句还会进行判断:

    java
    int a = 4;
    int b = 9;
    if (a < 1 & ++b < 50) {
        System.out.println('ok');    // 不执行
    }
    System.out.println(a, b);   // 结果显示4,10
  • 短路或:a || b,当ab有一个为真时,结果为真,否则为假,如果a为真,则b语句将不会执行判断

    但是对于逻辑或来说,如果a为真,b语句还会进行判断

  • 逻辑异或:a ^ b,当ab不同时,结果为真,否则为假

  • 在开发中,基本上都是使用短路与为主,因为前一个为假,后面的就不在判断执行了,效率高
  • 在开发中,基本上都是使用短路或为主,因为前一个为真,后面的就不在判断执行了,效率高

赋值运算符

赋值运算符就是将某个运算后的值,赋给指定的变量

  • 基本赋值运算符 =
  • 复合赋值运算符 +=-=*=/=%=

注意事项:

  • 赋值运算符的运算顺序是从右往左

  • 赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值

  • 复合赋值运算符会进行类型的强制转换

    java
    byte b = 2;
    b += 3;   // 等价于 b = (byte)(b + 3);    b + 3的类型是int,如果没有进行类型转换是编译不了的

三元运算符

基本语法:条件表达式 ? 表达式1 : 表达式2;

如果条件表达式为true,运算后的结果是表达式1;如果条件表达式为false,运算后的结果是表达式2

如果执行了表达式1,那么表达式2是不会执行的,反之同理

注意事项:

  • 表达式1和表达式2要为可以赋给接收变量的类型(或可以进行自动转换)

    java
    int a = 3;
    int b = 4;
    int c = a > b ? 1.1 : 3.4;     // 报错,编译不通过,double类型不能赋值给int类型
    double d = a > b ? a ; b;  // 不会报错,可以进行自动的类型转换,int类型可以自动转化到double类型

位运算符

计算机内部处理信息都是采用二进制数来表示

原码、反码和补码的概念:

对于有符号的数而言,有以下的八个规则(要背下来):

  1. 二进制的最高位是符号位:0表示正数;1表示负数
  2. 正数的原码、反码和补码都一样
  3. 负数的反码=它的原码符号位不变,其他位取反
  4. 负数的补码=它的反码+1; 负数的反码=负数的补码-1
  5. 0的反码、补码都是0
  6. Java没有无符号数,也就是说Java中的数都是有符号的
  7. 在计算机运算的时候,都是以补码的方式进行运算的(补码可以解决正数和负数)
  8. 当我们看运算结果的时候,要看他的原码

常见的位运算符有:位运算符的使用,先将两边的值先全部转成二进制,再得到这个二进制的补码,最后参与运算,运算后的结果先转回二进制的原码,再转回十进制

  • ~按位取反:0变1,1变0

    ~-2的运算过程:

    image-20250318205143135

    ~2的运算过程:

    image-20250318205419910

  • &按位与:两位全为1,结果为1,否则为0

    2 & 3的运算过程:由于是int类型,占4个字节

    image-20250318204848579

  • |按位或:两位有一个为1,结果为1,否则为0

  • ^按位异或:两位一个为0一个为1,结果为1,否则为0

  • >>算数右移:低位溢出,符号位不变,并用符号位补溢出的高位

    1 >> 2;结果为0,表示将十进制的1先转为二进制,再向右位移两位,本质就是1/2/2

  • <<算数左移:符号位不变,低位补0

    ``1 << 2;结果为4,表示将十进制的1先转为二进制,再向左位移两位,本质是122`

  • >>>无符号右移:低位溢出,高位补0


运算符的优先级

运算符有不同的优先级,下图中的运算符优先级从高到低依次为:

image-20250317203153087

只有单目运算符、赋值运算符是从右往左的,其他运算符都是从左到右的

优先级由高到低大致优先级分类为括号、单目运算符、算数运算符、位移运算符、比较运算符、逻辑运算符、三元运算符、赋值运算符

Released under the MIT License.