2

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

  • 算术运算符
  • 赋值运算符
  • 比较运算符(关系运算符)
  • 逻辑运算符
  • 位运算符
  • 三元运算符

2.4.1

运算符:算术运算符

1.算术运算符一览

image.png

2.练习代码

  1. /*
  2. 运算符之一:算术运算符
  3. + - + - * / % (前)++ (后)++ (前)-- (后)-- +
  4. */
  5. class AriTest {
  6. public static void main(String[] args) {
  7. //除号:/
  8. int num1 = 12;
  9. int num2 = 5;
  10. int result1 = num1 / num2;
  11. System.out.println(result1);//2
  12. int result2 = num1 / num2 * num2;
  13. System.out.println(result2);//10
  14. double result3 = num1 / num2;
  15. System.out.println(result3);//2.0
  16. double result4 = num1 / num2 + 0.0;//2.0
  17. double result5 = num1 / (num2 + 0.0);//2.4
  18. double result6 = (double)num1 / num2;//2.4
  19. double result7 = (double)(num1 / num2);//2.0
  20. System.out.println(result5);
  21. System.out.println(result6);
  22. // %:取余运算
  23. //结果的符号与被模数的符号相同
  24. //开发中,经常使用%来判断能否被除尽的情况。
  25. int m1 = 12;
  26. int n1 = 5;
  27. System.out.println("m1 % n1 = " + m1 % n1);
  28. int m2 = -12;
  29. int n2 = 5;
  30. System.out.println("m2 % n2 = " + m2 % n2);
  31. int m3 = 12;
  32. int n3 = -5;
  33. System.out.println("m3 % n3 = " + m3 % n3);
  34. int m4 = -12;
  35. int n4 = -5;
  36. System.out.println("m4 % n4 = " + m4 % n4);
  37. //(前)++ :先自增1,后运算
  38. //(后)++ :先运算,后自增1
  39. int a1 = 10;
  40. int b1 = ++a1;
  41. System.out.println("a1 = " + a1 + ",b1 = " + b1);
  42. int a2 = 10;
  43. int b2 = a2++;
  44. System.out.println("a2 = " + a2 + ",b2 = " + b2);
  45. int a3 = 10;
  46. ++a3;//a3++;
  47. int b3 = a3;
  48. //注意点:
  49. short s1 = 10;
  50. //s1 = s1 + 1;//编译失败
  51. //s1 = (short)(s1 + 1);//正确的
  52. s1++;//自增1不会改变本身变量的数据类型
  53. System.out.println(s1);
  54. //问题:
  55. byte bb1 =127;
  56. bb1++;
  57. System.out.println("bb1 = " + bb1);//结果是-128
  58. //(前)-- :先自减1,后运算
  59. //(后)-- :先运算,后自减1
  60. int a4 = 10;
  61. int b4 = a4--;//int b4 = --a4;
  62. System.out.println("a4 = " + a4 + ",b4 = " + b4);
  63. }
  64. }

3.算术运算符的注意问题

  • 如果对负数取模,可以把模数负号忽略不记,如: 5% 2=1 。 但被模数是 负数则不可忽略。此外,取模运算的结果不一定总是整数。
  • 对于除号 “/”,它的整数除和小数除是有区别的:整数之间做除法时,只 保留整数部分而舍弃小数部分。 例如: int x=3510;x=x/1000*1000; x 的 结果是?
  • 除字符串相加功能外,还能把非字符串转换成字符串 例如: System.out.println (“5+ 5+5); // 打印结果是 5+5=55 ?
  • 自增1不会改变本身变量的数据类型
  • 如果只有++运算,其实前++和后++都是一样的。

    4.练习

    1 :算术运算符:自加、自减 image.png
    image.png ```java /* 练习:随意给出一个三位数的整数,打印显示它的个位数,十位数,百位数的值。 格式如下: 数字xxx的情况如下: 个位数: 十位数: 百位数:

例如: 数字153的情况如下: 个位数:3 十位数:5 百位数:1

*/ class AriExer { public static void main(String[] args) {

  1. int num = 187;
  2. int bai = num / 100;
  3. int shi = num % 100 / 10;//int shi = num / 10 % 10;
  4. int ge = num % 10;
  5. System.out.println("百位为:" + bai);
  6. System.out.println("十位为:" + shi);
  7. System.out.println("个位为:" + ge);
  8. }

}

<a name="xNVk7"></a>
### 2.4.2
运算符: 赋值 运算符
<a name="HmQ30"></a>
#### 1.定义

- 符号: :=

当 ““==”两侧数据类型不一致时 可以使用 自动类型转换或使用强制
类型转换原则进行处理 。
<br />支持 连续赋值 。

- 扩展赋值运算符: :+=, --=, *=, /=,
<a name="Mgkqa"></a>
#### 2.代码实操
```java
/*
运算符之二:赋值运算符
=  +=  -=  *=  /=  %= 


*/
class SetValueTest {
    public static void main(String[] args) {
        //赋值符号:=
        int i1 = 10;
        int j1 = 10;

        int i2,j2;
        //连续赋值
        i2 = j2 = 10;

        int i3 = 10,j3 = 20;

        //*********************
        int num1 = 10;
        num1 += 2;//num1 = num1 + 2;
        System.out.println(num1);//12

        int num2 = 12;
        num2 %= 5;//num2 = num2 % 5;
        System.out.println(num2);

        short s1 = 10;
        //s1 = s1 + 2;//编译失败
        s1 += 2;//结论:不会改变变量本身的数据类型
        System.out.println(s1);

        //开发中,如果希望变量实现+2的操作,有几种方法?(前提:int num = 10;)
        //方式一:num = num + 2;
        //方式二:num += 2; (推荐)

        //开发中,如果希望变量实现+1的操作,有几种方法?(前提:int num = 10;)
        //方式一:num = num + 1;
        //方式二:num += 1; 
        //方式三:num++; (推荐)

        //练习1
        int i = 1;
        i *= 0.1;
        System.out.println(i);//0
        i++;
        System.out.println(i);//1

        //练习2
        int m = 2;
        int n = 3;
        n *= m++; //n = n * m++;    
        System.out.println("m=" + m);//3
        System.out.println("n=" + n);//6

        //练习3
        int n1 = 10;
        n1 += (n1++) + (++n1);//n1 = n1 + (n1++) + (++n1);
        System.out.println(n1);//32=10+10+12

    }
}

3.思考题

image.png(答案见上)

2.4.3

运算符: 比较 运算符

1.定义

image.png

  • 比较运算符的结果都是 boolean 型,也就是要么是 true ,要么是 false 。

  • 比较运算符“==” 不能误写成“=” 。

    2.代码实操

    ```java /* 运算符之三:比较运算符 == != > < >= <= instanceof

结论: 1.比较运算符的结果是boolean类型 2.区分 == 和 = */ class CompareTest { public static void main(String[] args) { int i = 10; int j = 20;

    System.out.println(i == j);//false
    System.out.println(i = j);//20

    boolean b1 = true;
    boolean b2 = false;
    System.out.println(b2 == b1);//false
    System.out.println(b2 = b1);//true
}

}

<a name="YtJw1"></a>
#### 3.思考题
![image.png](https://cdn.nlark.com/yuque/0/2021/png/2196885/1620452012038-689753e5-0fb8-4cc3-82a2-8168adf47d73.png#clientId=u00d04362-aa72-4&from=paste&height=268&id=ua656fe96&margin=%5Bobject%20Object%5D&name=image.png&originHeight=268&originWidth=350&originalType=binary&size=19521&status=done&style=none&taskId=u99570fb8-2168-483e-a330-5e9b3e504a7&width=350)
<a name="dZnFP"></a>
### 2.4.4
运算符:逻辑运算符
<a name="Wx1Bl"></a>
#### 1.定义
![image.png](https://cdn.nlark.com/yuque/0/2021/png/2196885/1620452083913-a33e3ef0-3243-410e-8c4d-5e9b79c71b75.png#clientId=u00d04362-aa72-4&from=paste&height=320&id=ue5d4a8fe&margin=%5Bobject%20Object%5D&name=image.png&originHeight=333&originWidth=692&originalType=binary&size=38823&status=done&style=none&taskId=u007d5402-985f-43cf-9ae8-a411f43f529&width=666)

- 
逻辑运算符用于连接布尔型表达式,在 Java 中不可以写成 3<x<6 ,应该写
成 x>3 & x<6 。
- “&”和“&&”的区别:

单&时,左边无论真假,右边都进行运算;
<br />双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算 。

- “|”和“||” 的区别同理, ||表示:当左边为真,右边不参与运算 。
- 异或 ( ^) 与或 ( | )的不同之处是:当左右都为 true 时,结果为 false 。

理解:异或,追求的是“异”
<a name="fqZoO"></a>
#### 2.代码练习
```java
/*
运算符之四:逻辑运算符

&  && |  || ! ^

说明:
1.逻辑运算符操作的都是boolean类型的变量


*/
class LogicTest {
    public static void main(String[] args) {

        //区分& 与 &&
        //相同点1:& 与  && 的运算结果相同
        //相同点2:当符号左边是true时,二者都会执行符号右边的运算
        //不同点:当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。
        //开发中,推荐使用&&
        boolean b1 = true;
        b1 = false;
        int num1 = 10;
        if(b1 & (num1++ > 0)){
            System.out.println("我现在在北京");
        }else{
            System.out.println("我现在在南京");
        }

        System.out.println("num1 = " + num1);


        boolean b2 = true;
        b2 = false;
        int num2 = 10;
        if(b2 && (num2++ > 0)){
            System.out.println("我现在在北京");
        }else{
            System.out.println("我现在在南京");
        }

        System.out.println("num2 = " + num2);

        // 区分:| 与 || 
        //相同点1:| 与  || 的运算结果相同
        //相同点2:当符号左边是false时,二者都会执行符号右边的运算
        //不同点3:当符号左边是true时,|继续执行符号右边的运算,而||不再执行符号右边的运算
        //开发中,推荐使用||
        boolean b3 = false;
        b3 = true;
        int num3 = 10;
        if(b3 | (num3++ > 0)){
            System.out.println("我现在在北京");
        }else{
            System.out.println("我现在在南京");
        }
        System.out.println("num3 = " + num3);


        boolean b4 = false;
        b4 = true;
        int num4 = 10;
        if(b4 || (num4++ > 0)){
            System.out.println("我现在在北京");
        }else{
            System.out.println("我现在在南京");
        }
        System.out.println("num4 = " + num4);
    }
}

3.练习:请

写出每题的输出结果 image.pngimage.png

4.【

面试题 】 程序输出: image.png

2.4.5

运算符:位运算符

1.定义

image.png

2.代码实操

/*
运算符之五:位运算符 (了解)

结论:
1. 位运算符操作的都是整型的数据
2. << :在一定范围内,每向左移1位,相当于 * 2
   >> :在一定范围内,每向右移1位,相当于 / 2



面试题:最高效方式的计算2 * 8 ?  2 << 3  或 8 << 1
*/
class BitTest {
    public static void main(String[] args) {
        int i = 21;
        i = -21;
        System.out.println("i << 2 :" + (i << 2));
        System.out.println("i << 3 :" + (i << 3));
        System.out.println("i << 27 :" + (i << 27));

        int m = 12;
        int n = 5;
        System.out.println("m & n :" + (m & n));
        System.out.println("m | n :" + (m | n));
        System.out.println("m ^ n :" + (m ^ n));

        //练习:交换两个变量的值
        int num1 = 10;
        int num2 = 20;
        System.out.println("num1 = " + num1 + ",num2 = " + num2);

        //方式一:定义临时变量的方式
        //推荐的方式
        int temp = num1;
        num1 = num2;
        num2 = temp;

        //方式二:好处:不用定义临时变量  
        //弊端:① 相加操作可能超出存储范围 ② 有局限性:只能适用于数值类型
        //num1 = num1 + num2;
        //num2 = num1 - num2;
        //num1 = num1 - num2;

        //方式三:使用位运算符
        //有局限性:只能适用于数值类型
        //num1 = num1 ^ num2;
        //num2 = num1 ^ num2;
        //num1 = num1 ^ num2;

        System.out.println("num1 = " + num1 + ",num2 = " + num2);

    }
}

image.pngimage.pngimage.pngimage.png

3.位运算符的细节

image.png

2.4.6

运算符:三元运算符

1.定义

image.png

2.代码演示

/*
运算符之六:三元运算符
1.结构:(条件表达式)? 表达式1 : 表达式2
2. 说明
① 条件表达式的结果为boolean类型
② 根据条件表达式真或假,决定执行表达式1,还是表达式2.
  如果表达式为true,则执行表达式1。
  如果表达式为false,则执行表达式2。
③ 表达式1 和表达式2要求是一致的。
④ 三元运算符可以嵌套使用

3. 
凡是可以使用三元运算符的地方,都可以改写为if-else
反之,不成立。

4. 如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高。
*/
class SanYuanTest {
    public static void main(String[] args) {

        //获取两个整数的较大值
        int m = 12;
        int n = 5;

        int max = (m > n)? m : n;
        System.out.println(max);

        double num = (m > n)? 2 : 1.0;

        //(m > n)? 2 : "n大";//编译错误

        //**************************
        n = 12;
        String maxStr = (m > n)? "m大" : ((m == n)? "m和n相等" : "n大");
        System.out.println(maxStr);

        //*****************************
        //获取三个数的最大值
        int n1 = 12;
        int n2 = 30;
        int n3 = -43;

        int max1 = (n1 > n2)? n1 : n2;
        int max2 = (max1 > n3)? max1 : n3;
        System.out.println("三个数中的最大值为:" + max2);

        //不建议
        //int max3 = (((n1 > n2)? n1 : n2) > n3)? ((n1 > n2)? n1 : n2) : n3;
        System.out.println("三个数中的最大值为:" + max3);

        //该写成if-else:
        if(m > n){
            System.out.println(m);
        }else{
            System.out.println(n);
        }
    }
}

2.4.7 运算符的优先级

  • 运算符有不同的优先级,所谓 优先级就是表达式运算中的运 算顺序。如右表,上一行运算 符总优先于下一行。
  • 只有单目运算符、三元运算符、 赋值运算符是从右向左运算的。

image.png

每日一考

1.“&”和“&&”的异同

后者为短路与,开发常用

2.程序输出

class OperatorTest {
    public static void main(String[] args) {
        boolean x = true;
        boolean y = false;
        short z = 40;
        if ((z++ == 40) && (y = true)) {
            z++;
        }
        if ((x = false) || (++z == 43)) {
            z++;
        }
        System.out.println("z = " + z);
    }
}

结果为:44

3.定义三个int型变量并赋值,使用三元运算符或者if-else获取这三个数中的较大数的实现

int num1 = 10,num2 = 21,num3 = -21;

int max;
if(num1 >= num2 && num1 >= num3){
    max = num1;
}else if(num2 >= num1 && num2 >= num3){
    max = num2;
        }else{
            max = num3;
}

System.out.println("三个数中的最大值为:" + max);

4.编写程序,声明2个double型变量并赋值。判断第一个数大于10.0,且第2个数小于20.0,打印两数之和。否则,打印两数的乘积。

double d1 = 12.3;
double d2 = 32.1;
if(d1 > 10 && d2 < 20){
    System.out.println(d1+d2);
}else{
    System.out.println(d1*d2);
}

5. 交换两个变量值的代码的实现

String s1 = "北京";
String s2 = "南京";

String temp = s1;
         s1 = s2;
         s2 = temp;