MENU

Java-07 赋值运算符&比较运算符&逻辑运算符&位运算符

August 8, 2023 • Read: 102 • Java阅读设置

Java基本语法

赋值运算符=

  • 符号:=
  • =两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
  • 支持连续赋值,即相同类型的变量,可以在一个语句(即一个分号内)内,通过逗号分隔,同时定义、初始化。
    2023-08-08T03:48:05.png
  • 赋值运算符的扩展:+=, -=, *=, /=, %=

    • 注意点:不会改变变量本身的数据类型。
      2023-08-08T03:55:36.png
    • 问题:希望变量num实现+2的操作,有几种方法?(前提:int num = 10)

      • 方式一:num = num + 2
      • 方式二:num += 2,并且这种方式比方式一更好,因为不会改变变量的数据类型。
      • 方式三:num++++或(num++)++,这是错误的。
        2023-08-08T04:00:53.png
    • 问题:希望变量num实现+1的操作,有几种方法?(前提:int num = 10)

      • 方式一:num = num + 1
      • 方式二:num += 1
      • 方式三:num++,这种方式与方式二相比实际上好坏程度一样,但代码量更少一点,因此更好一点点。
  • 赋值运算符练习

    • 2023-08-08T06:33:00.png
      2023-08-08T06:33:23.png
    • 注意:赋值运算符的扩展并不改变数据类型,因此i *= 0.1不会编译出错,结果仍然是整型。
      2023-08-08T06:37:10.png
    • 注意:后自增或自减是先运算再+1或-1,因此n *= m++时,先进行n = n * m,再进行m = m + 1,当然计算是这么计算的,但本质上还是有区别,都不会改变数据类型。
      2023-08-08T06:41:34.png
    • 注意:(n++)或(++n)单独出现不是语句,即会报错。因此n += (n++) + (++n)可以理解为n = n + (n++) + (++n),从左到右顺序执行且(n++)(++n)无法单独执行,n + n = 20(运算)-->n = n + 1 = 11(后增)-->n = n + 1(先曾)==12--> 20 + n(运算) = 32 (前提:int n = 10)。
      2023-08-08T06:58:17.png

比较运算符

  • Java中的比较运算符
    2023-08-08T07:06:25.png
  • 比较运算符的结果都是boolean型,即要么是true,要么是false
  • 比较运算符==,不要误写成=。误写是不会编译错误,当误写成赋值运算符=时,相当于a=b这样的表达式,其结果就是一个值(b值,反正这样赋值后,a的值等于b的值,它们值都相等),相当于表达式的结果是a值,但输出结果之前进行了将b值赋值给a的操作。该值不一定是boolean类型。

    • 这说明(a = b)是一个表达式,会有一个结果,实际上结果就是b
      2023-08-08T07:18:17.png
  • > < >= <=:只能使用在数值类型的数据之间。
  • ==:不仅可以使用在数值类型数据之间,还可以使用在其他引用类型数据之间,比如String

逻辑运算符

  • Java中的逻辑运算符:
    2023-08-08T07:20:07.png
  • 逻辑运算符的操作对象为boolean类型。
    在位运算符中存在与逻辑运算符中相同的符号,判断一个表达式是逻辑表达式还是位表达式,就看操作对象的数据类型。
  • 单与(逻辑与)&和双与(短路与)&&,单或|和双或||的计算结果是相同的,区别在于计算过程。

    • &&&的异同点

      • 相同点1:运算结果相同。
      • 相同点2:当符号左边为true时,二者都会执行符号右边的运算。
        2023-08-08T07:38:51.png
      • 不同点:当符号左边为false时,&会继续执行符号右边的运算,而&&不会继续执行符号右边的运算。
        2023-08-08T07:39:22.png
      • 开发中,推荐使用&&
    • |||的异同点(类似于&&&

      • 相同点1:运算结果相同。
      • 相同点2:当符号左边为false时,二者都会执行符号右边的运算。
        2023-08-08T07:46:44.png
      • 不同点:当符号左边为true时,|会继续执行符号右边的运算,而||不会继续执行符号右边的运算。
        2023-08-08T07:47:21.png
      • 开发中,推荐使用||
  • 面试题
    2023-08-08T07:56:09.png

位运算符

  • Java中的位运算符:
    2023-08-08T07:57:11.png
  • 位运算是直接对整数的二进制进行的运算,即位运算符操作的都是整型的数据,其运算结果也是整型数值。
  • <<:在一定范围内,每向左移一位,相当于*2,超过一定范围符号会变。
    >>:在一定范围内,每向右移一位,相当于/2,超过一定范围符号会变。
    2023-08-08T08:10:31.png
    2023-08-08T08:11:38.png
  • 面试题:最高效方式计算2 * 82 << 38 << 1
  • >>注意点:最高位为1,即负数时,右移的空位都用1补,最高位为0,即正数时,右移的空位都用0补。
    理解:负数的二进制是补码,因此高位都为1就相当于正数的高位都为0。
  • >>>无符号右移表示,不论最高位是什么,即不论是正数还是负数,右移的空位全用0补。也就是说,若为负数,进行无符号右移会马上变为正数。
  • 位运算符细节:
    2023-08-08T08:19:13.png
  • 其他位运算符的使用

    • 2023-08-08T08:22:57.png
    • 2023-08-08T08:23:35.png
    • 取反~:包括符号位在内,0110

      • 这里计算注意一下:下面一行就是6变为-6后的反码,即-6的反码,相当于求-6反码代表哪个数,首先它是负数,其次这个数+1就是-6的补码,即这个数+1是-6,因此是-7。
        2023-08-08T08:29:35.png
  • 位运算符练习

    • ^操作:存在这样的规律,若m ^ n = k,那么k ^ m = nk ^ n = m
      2023-08-08T08:43:32.png
    • 无符号右移>>>练习:

      • String.toBinaryString(int i):返回参数i对应的二进制字符串,没有多余的高位0,即无符号二进制字符串。
      • String.toHexString(int i):返回参数i对应的十六进制字符串,没有多余的高位0,即无符号十六进制字符串。
        2023-08-10T08:03:56.png
Last Modified: October 26, 2023