重学Java-第六章 Java运算符

6.1 算术运算符

​ Java 语言提供了执行加减乘除四则运算的运算符。 算数运算符被用在数学表达式中,可以使用任意嵌套的小括号,其作用与数学中相同。下表列出了算术运算符:

运算符 描述 例子
+ 加法运算符(也用于连接字符串) a+b
- 减法运算符 a-b
* 乘法运算符 a*b
/ 除法运算符 a/b
% 取余运算符 a%b
++ 自增运算符 a++
-- 自减运算符 a--

6.2 关系运算符

​ 关系运算符又称为比较运算符,比较的结果是一个布尔类型的值(true 或 false)。Java语言中有如下可用于变量比较的运算符(在例子中,初始化int a = 2; int b = 4):

运算符 描述 例子
== 相等 a==b,为假
!= 不等于 a != b,为真
> 大于 a > b,为假
< 小于 a < b,为真
>= 大于或等于 a >=b,为假
<= 小于或等于 a <= b,为真

6.3 位运算符

​ Java语言还提供了对整数类型执行按位和移位操作的运算符,称为位运算符。在实际的编码中位运算符并不常用。下表列出了位运算的基本运算:

运算符 描述
& 按位与,如果相对应位都是1,则结果为1,否则为0
| 按位或,如果相对应位都是0,则结果为0,否则为1
^ 按位异或,如果相对应位相同,则结果为0,否则为1
~ 按位取反,翻转操作数的每一位,即0变1,1变0
<< 按位左移,左操作数按位左移右操作数指定的位数,如a << 2
>> 按位右移,左操作数按位右移右操作数指定的位数,如a >> 2
>>> 零填充右移,按位右移补零操作符,左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充,如 a >>> 2

​ 案例如下:

public class Demo {
    public static void main(String[] args) {
        // a 的二进制表示:0000 0010      b的二进制表示:0000 0101
        int a = 2, b = 5;
        System.out.println(a & b);  // 0
        System.out.println(a | b);  // 7
        System.out.println(a ^ b);  //7
        System.out.println("取反运算结果"+~a);    // -3
        System.out.println(a << 2);     // 8
        System.out.println(b >> 2);     // 1
        System.out.println(a >>> 2);    // 0
    }
}

6.4 逻辑运算符

​ 逻辑运算符用来表示日常交流中的“并且”,“或者”,“除非”等思想。&(与)、|(或)、!(非)、&&(短路与)、||(短路或)、^(异或)都是java中的逻辑运算符,逻辑运算符可以在表达式中生成组合条件,例如在执行特定语句块之前必须满足的两个或多个条件。使用逻辑运算符可以描述这些组合,逻辑运算符的返回结果只能为真(true)或假(false)。具体用法见下表:

逻辑运算符 名称 示例 作用
& a & b a,b都为真,则结果为真,反之,a,b都为假,则结果为假
| a | b a,b有一个为真,则结果为真
!a a为真则结果为真,a为假则结果为假
&& 短路与 a && b a,b都为真,则结果为真
|| 短路或 a || b a,b有一个为真,则结果为真
^ 异或 a ^ b a,b都为真,或都为假时,结果为假

​ 实例如下:

public class Test {
  public static void main(String[] args) {
     boolean a = true;
     boolean b = false;
     System.out.println("a && b = " + (a&&b));
     System.out.println("a || b = " + (a||b) );
     System.out.println("!(a && b) = " + !(a && b));
  }
}

// 运行结果
/*
a && b = false
a || b = true
!(a && b) = true
*/

6.4.1 &和&&

	&与&&都表示逻辑与,它们的区别在于**`&`**需要判断左右两边的值才能确定整个表达式的值。而**`&&`**有时只需判断左边的值就可以确定整个表达式的值,`当左边的值为false时,就不需要判断右边的值了,此时整个表达式的值为false`。当左边的值为true时,此时需要判断右边的值了,若右边的值为true,此时整个表达式的值为true,若右边的值为false时,此时整个表达式的值为false。

​ 结合下面的代码可以有更好地理解:

public class Demo01 {
    public static void main(String[] args) {
        if (A() & C()) {        //A()方法和C()方法作逻辑与运算
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

    public static boolean A() {
        System.out.println("我是方法A");
        return true;
    }

    public static boolean B() {
        System.out.println("我是方法B");
        return false;
    }

    public static boolean C() {
        System.out.println("我是方法C");
        return true;
    }
}

​ 上面的代码中定义了3个方法,A方法和C方法都返回true,B方法返回false,在主方法中使用if语句将A方法和C方法做逻辑与&运算,根据&的运算法则,需要判断左右两边的值才能确定整个表达式的值,A方法和C方法都为真,那么结果应该为真。执行结果如下:

​ 从执行结果可以看到,控制台输出了A方法和C方法中的输出语句,说明&左右两边都执行了,还输出了“结果为真”,说明两边为真则结果为真。

​ 同理,修改主方法中if语句中的表达式,将A方法和B方法做&运算,结果如下:

​ 说明左右两边有一边为假,则结果为假。

​ 交换if语句中A()和B()的位置,

public static void main(String[] args) {
        if (B() & A()) {
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

​ 执行结果如下:

接下来我们看&&逻辑运算符

​ 修改主方法中if语句中的表达式,将A()方法和B()方法作&&(短路与)运算

public static void main(String[] args) {
        if (A() && B()) {
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

​ 执行结果如下:

​ 将A()方法和B()方法位置调换:

public static void main(String[] args) {
        if (B() && A()) {
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

​ 只是调换了一下位置,结果就不一样了。是因为&&运算符在判断左边的值时,左边的值为false,就不用判断右边的值了,整个表达式的值为false。所以只执行了B方法中的输出语句,A方法没有执行。可以对比上面的A()和B()做&运算的结果(下图),&运算左右两边都执行了,&&只执行了左边。

6.4.2 | 和 ||

​ | 和 || 都表示逻辑或,其用法跟&和&&差不多, || 的运算法则是当左边的值为true时,就不用判断右边了,整个表达式结果为tru。若左边为false,需要判断右边的值,右边为true,则整个表达式结果为true,右边为false,则则整个表达式结果为false。

	 结合代码理解,修改上面的代码:
public static void main(String[] args) {
        if (A() | B()) {
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }
	结果如下:

	 | 运算一边为真,则结果为真。做 || 运算结果如下:

​ 左边为true,右边不用判断,所以没有执行B方法。调换if中A()和B()的位置,结果如下:

​ 左边为false,需要判断右边,右边为true,所以结果为true,两个方法都执行了。

6.4.3 逻辑运算符的优先顺序

逻辑非的优先级最高,逻辑与次之,逻辑或最低,即:!(非) → &&(与) → ||(或)

分析下面代码:

public static void main(String[] args) {
        if (B() || A() && C()) {
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

若按照优先顺序,先运算 A() && C(),之后B()再和(A() && C())的结果做短路或(||)运算

执行结果:

执行的结果时按照左右顺序来的????????
我表示一脸懵!!待研究······

Tips:&&的优先级高于||,但运算符的优先级与系统进行表达式运算的顺序没有必然的关系,比如表达式B() || A() && C(),由于&&优先级高于||,所以等效于B() ||( A() && C()),但是系统会先对表达式中的B()进行判断,若B()的值为真,则由于逻辑运算符的短路效应,后面的表达式A() && C()就不再判断;反之则继续进行表达式A() && C()的判断。

public static void main(String[] args) {
        if (A() || B() && C()) {        //A()方法和C()方法作逻辑与运算
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

​ 如上代码所示,A()的值为真,由短路效应得知,B() && C()就不用判断了,其运行结果如下: image-20221022103408199

6.5 赋值运算符

​ 赋值运算符是为指定变量分配值的符号,如下是Java中常用的赋值运算符:

运算符 描述 例子
= 简单的赋值运算符,将值从右侧操作数分配给左侧操作数 c = a + b将a + b的值赋给c
+= 加和赋值运算符。它将右操作数添加到左操作数,并将结果分配给左操作数。 c += a等于c = c + a
-= 减和赋值运算符。它从左侧操作数中减去右侧操作数,并将结果分配给左侧操作数。 c -= a等于c = c - a
*= 乘和赋值运算符。它将右操作数与左操作数相乘,并将结果分配给左操作数。 c *= a等于c = c * a
/= 除和赋值运算符。它将左操作数除以右操作数,并将结果分配给左操作数。 c /= a等于c = c / a

6.6 其他运算符

6.6.1 条件运算符

​ 条件运算符也称为三元运算符。该运算符由三个操作数组成,用于判断布尔表达式。它的目的是确定应将哪个值分配给变量。条件运算符的语法为:

变量 = (布尔表达式) ? 值1 : 值2

​ 如果布尔表达式为真,就将 值1分配变量,否则将 值2分配给变量。实例如下:

public class Demo02 {
    public static void main(String[] args) {
        int age = 18;
        System.out.println((age>=18) ? "你已成年了!" : "你还未成年呢!");
    }
    
    // 控制台输出“你已成年了!”
}

6.6.2 instanceof 运算符

instanceof运算符将对象与指定类型进行比较,检查对象是否是一个特定类型(类类型或接口类型)。

​ 语法为:

( Object reference variable ) instanceof (class/interfacetype)

​ instanceof左侧的变量所指向的对象,是instanceof右侧类或接口的一个对象,结果为真,否则结果为假。实例如下:

public class Demo02 {
    public static void main(String[] args) {
        String str = "Hello, world";
        boolean b = str instanceof String;
        System.out.println(b);
    }

    // 控制台输出“true”
}
posted @ 2023-02-15 11:51  XQ-Yang  阅读(18)  评论(0)    收藏  举报