作用

  • 表达式:用运算符连接起来的式子
  • 运算符的分类:按照功能分:算术运算符、赋值运算符、比较运算符、逻辑运算、条件运算符…

2.10 运算符 Operator - 图1

2.10.1 算术运算符

算术运算符 符号解释
+ 加法运算,字符串连接运算,正号
- 减法运算,负号
* 乘法运算
/ 除法运算,整数/整数结果还是整数
% 求余运算,余数的符号只看被除数
++-- 自增自减运算

加减乘除模

  1. public class OperatorDemo01 {
  2. public static void main(String[] args) {
  3. int a = 3;
  4. int b = 4;
  5. System.out.println(a + b);// 7
  6. System.out.println(a - b);// -1
  7. System.out.println(a * b);// 12
  8. System.out.println(a / b);// 计算机结果是0,为什么不是0.75呢?
  9. System.out.println(a % b);// 3
  10. System.out.println(5%2);//1
  11. System.out.println(5%-2);//1
  12. System.out.println(-5%2);//-1
  13. System.out.println(-5%-2);//-1
  14. //商*除数 + 余数 = 被除数
  15. //5%-2 ==>商是-2,余数时1 (-2)*(-2)+1 = 5
  16. //-5%2 ==>商是-2,余数是-1 (-2)*2+(-1) = -4-1=-5
  17. }
  18. }

“+”号的两种用法

  • 第一种:对于+两边都是数值的话,+就是加法的意思
  • 第二种:对于+两边至少有一边是字符串得话,+就是拼接的意思

    public class OperatorDemo02 {
      public static void main(String[] args) {
          // 字符串类型的变量基本使用
          // 数据类型 变量名称 = 数据值;
          String str1 = "Hello";
          System.out.println(str1); // Hello
    
          System.out.println("Hello" + "World"); // HelloWorld
    
          String str2 = "Java";
          // String + int --> String
          System.out.println(str2 + 520); // Java520
          // String + int + int
          // String        + int
          // String
          System.out.println(str2 + 5 + 20); // Java520
    
          // 先加后拼接
          System.out.println(5 + 20 + str2); // 25Java
      }
    }
    

自加自减运算

理解:++ 运算,变量自己的值加1。反之,-- 运算,变量自己的值减少1,用法与++ 一致。

单独使用
  • 变量在单独运算的时候,变量前++和变量++,变量的是一样的
  • 变量前++ :例如 ++a
  • 变量后++ :例如 a++
    public class OperatorDemo3 {
      public static void main(String[] args) {
          // 定义一个int类型的变量a
          int a = 3;
          //++a;
          a++;
          // 无论是变量前++还是变量后++,结果都是4
          System.out.println(a);
      }
    }
    

复合使用
  • 其他变量放在一起使用或者和输出语句放在一起使用前++后++就不同了
  • 变量前++ :变量先自身加1,然后再取值
  • 变量后++ :变量先取值,然后再自身加1
public class OperatorDemo03 {
    public static void main(String[] args) {
        // 其他变量放在一起使用
        int x = 3;
        //int y = ++x; // y的值是4,x的值是4,
        int y = x++; // y的值是3,x的值是4

        System.out.println(x);
        System.out.println(y);
        System.out.println("==========");

        // 和输出语句一起
        int z = 5;
        //System.out.println(++z);// 输出结果是6,z的值也是6
        System.out.println(z++);// 输出结果是5,z的值是6
        System.out.println(z);

        int a = 1;
        a = a++;//(1)先取a的值“1”放操作数栈(2)a再自增,a=2(3)再把操作数栈中的"1"赋值给a,a=1

        int i = 1;
        int j = i++ + ++i * i++;
        /*
        从左往右加载
        (1)先算i++
        ①取i的值“1”放操作数栈
        ②i再自增 i=2
        (2)再算++i
        ①i先自增 i=3
        ②再取i的值“3”放操作数栈
        (3)再算i++
        ①取i的值“3”放操作数栈
        ②i再自增 i=4
        (4)先算乘法
        用操作数栈中3 * 3 = 9,并把9压会操作数栈
        (5)再算求和
        用操作数栈中的 1 + 9 = 10
        (6)最后算赋值
        j = 10
        */
    } 
}

小结

  • ++在前,先自加,后使用;
  • ++在后,先使用,后自加。

    练习

    获取一个四位数的个位,十位,百位,千位
    public class Test01 {
      public static void main (String [] args) {
          //1.定义一个四位数,例如1234
          int num = 1234;
    
          //2.通过运算操作求出个位,十位,百位,千位
          int ge = 1234 % 10;
          int shi = 1234 / 10 % 10;
          int bai = 1234 / 100 % 10;
          int qian = 1234 / 1000 % 10;
    
          System.out.println(num + "这个四位数个位上的数字是:" + ge);
          System.out.println(num + "这个四位数十位上的数字是:" + shi);
          System.out.println(num + "这个四位数百位上的数字是:" + bai);
          System.out.println(num + "这个四位数千位上的数字是:" + qian);
      }
    }
    

自增自减练习

判断如下代码的运行结果

    public static void main(String[] args){
        int i = 1;
        int j = i++;
        int k = i++ * ++j + ++i * j++;

        System.out.println("i = " + i);
        System.out.println("j = " + j);
        System.out.println("k = " + k);
    }
    public static void main(String[] args){
        int i = 1;
        int j = i++;
        int k = i++ * ++j + --i * j--;

        System.out.println("i = " + i);
        System.out.println("j = " + j);
        System.out.println("k = " + k);
    }
    public static void main(String[] args){
        int i = 1;
        int j = ++i + i++ * ++i + i++;

        System.out.println("i = " + i);
        System.out.println("j = " + j);
    }
public static void main(String[] args){
    int i = 0;
    int result = ++i/--i;
    System.out.println("result="+result);
}

2.10.2 赋值运算符

注意:所有的赋值运算符的 = 左边一定是一个变量

赋值运算符 符号解释
= 将符号右边的值,赋值给左边的变量
+= 将符号**左边的值****右边的值**
进行相加操作,最后将结果**赋值给左边的变量**
-= 将符号**左边的值****右边的值**
进行相减操作,最后将结果**赋值给左边的变量**
*= 将符号**左边的值****右边的值**
进行相乘操作,最后将结果**赋值给左边的变量**
/= 将符号**左边的值****右边的值**
进行相除操作,最后将结果**赋值给左边的变量**
%= 将符号**左边的值****右边的值**
进行取余操作,最后将结果**赋值给左边的变量**

基本赋值运算符课堂案例

public class OperatorDemo04 {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        a = a + b; 
        System.out.println(a); // 7
        System.out.println(b); // 4    
    }
}

扩展赋值运算符课堂案例

public class OperatorDemo04 {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        b += a;// 相当于 b = b + a ; 
        System.out.println(a); // 3
        System.out.println(b); // 7    

        short s = 3;
        // s = s + 4; 代码编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度
        s += 4; // 代码没有报错
        //因为在得到int类型的结果后,JVM自动完成一步强制类型转换,将int类型强转成short
        System.out.println(s);

        int j = 1;
        j += ++j * j++;//相当于  j = j + (++j * j++);
        System.out.println(j);//5
    }
}

扩展赋值运算符在将最后的结果赋值给左边的变量前,都做了一步强制类型转换

练习

交换两个变量的值
int m = 1;
int n = 2;

int m = 1;
int n = 2;
int temp = m;
m = n;
n = temp;

2.10.3 关系运算符/比较运算符

关系运算符 符号解释
< 比较符号左边的数据是否小于右边的数据,如果小于结果是true
> 比较符号左边的数据是否大于右边的数据,如果大于结果是true
<= 比较符号左边的数据是否小于或者等于右边的数据,如果大于结果是false
>= 比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是false
== 比较符号两边数据是否相等,相等结果是true
!= 不等于符号 ,如果符号两边的数据不相等,结果是true
  • 比较运算符,是两个数据之间进行比较的运算,运算结果一定是 boolean 值true或者false
  • 其中 >,<,>=,<= 不支持 boolean,String 类型,== 和 != 支持boolean 和 String

    public class OperatorDemo05 {
      public static void main(String[] args) {
          int a = 3;
          int b = 4;
    
          System.out.println(a < b); // true
          System.out.println(a > b); // false
          System.out.println(a <= b); // true
          System.out.println(a >= b); // false
          System.out.println(a == b); // false
          System.out.println(a != b); // true
      }
    }
    

练习:判断如下程序的运行结果

public static void main(String[] args){
    int a = 1;
    int b = 2;
    int c = 0;
    boolean flag = false;
    if(flag=true){
        c = a++ + b;
    }

    if(flag=false){
        c = ++a - b;
    }
    System.out.println("a = " + a);
    System.out.println("b = " + b);
    System.out.println("c = " + c);
}

2.10.4 逻辑运算符

逻辑运算符,是用来连接两个布尔类型结果的运算符(!除外),运算结果一定是boolean值true或者false

逻辑运算符 符号解释 符号特点
& 与,且 falsefalse
&#124; truetrue
^ 异或 相同为false,不同为true
! falsetrue
truefalse
&& 双与,短路与 左边为false,则右边就不看
&#124;&#124; 双或,短路或 左边为true,则右边就不看

课堂案例

public class OperatorDemo06 {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        int c = 5;

        // & 与,且;有false则false
        System.out.println((a > b) & (a > c)); 
        System.out.println((a > b) & (a < c)); 
        System.out.println((a < b) & (a > c)); 
        System.out.println((a < b) & (a < c)); 
        System.out.println("===============");
        // | 或;有true则true
        System.out.println((a > b) | (a > c)); 
        System.out.println((a > b) | (a < c)); 
        System.out.println((a < b) | (a > c));
        System.out.println((a < b) | (a < c));
        System.out.println("===============");
        // ^ 异或;相同为false,不同为true
        System.out.println((a > b) ^ (a > c));
        System.out.println((a > b) ^ (a < c)); 
        System.out.println((a < b) ^ (a > c)); 
        System.out.println((a < b) ^ (a < c)); 
        System.out.println("===============");
        // ! 非;非false则true,非true则false
        System.out.println(!false);
        System.out.println(!true);
    }
}

&&和&区别,||和|区别

  • **&&****&**区别:
    • &&&结果一样,&&有短路效果,左边为 false,右边不执行;&左边无论是什么,右边都会执行
  • **||****|**区别:
    • |||结果一样,||有短路效果,左边为 true,右边不执行;|左边无论是什么,右边都会执行

面试题1:输出结果是什么

public class LogicExer1{
    public static void main(String[] args){
        int x = 1;
        int y = 1;

        //x==2 ,x++  false  x = 2 左边为false
        //右边继续
        //++y  y==2  y=2  y==2成立  右边为true
        //false & true 结果false
        if(x++==2 & ++y==2){
            x =7;
        }
        System.out.println("x="+x+",y="+y);//x=2,y=2
    }
}
public class LogicExer2{
    public static void main(String[] args){
        int x = 1,y = 1;

        //x==2,x++  左边条件为false,x=2
        //因为短路与,右边不算
        //false && ? 结果是false
        if(x++==2 && ++y==2){
            x =7;
        }
        System.out.println("x="+x+",y="+y);//x=2,y=1
    }
}
public class LogicExer3{
    public static void main(String[] args){
        int x = 1,y = 1;

        //x==1,x++  左边为true,x=2
        //因为是逻辑与,右边继续  
        //++y, y==1  y=2 右边为false
        //条件true | false,最终为true
        if(x++==1 | ++y==1){
            x =7;
        }
        System.out.println("x="+x+",y="+y);//x=7,y=2
    }
}
public class LogicExer4{
    public static void main(String[] args){
        int x = 1,y = 1;

        //x==1,x++  左边为true,x=2
        //因为是短路或,左边为true,右边就不看了
        //整个条件为true
        if(x++==1 || ++y==1){
            x =7;
        }
        System.out.println("x="+x+",y="+y);//x=7,y=1

    }
}

4、面试题2:输出结果是什么

public class LogicExer5{
    public static void main (String []  args)  {
        boolean x = true;
        boolean y = false;
        short z = 42;

        //如果if((z++==42)&&(y==true))条件成立,执行z++,不成立,就不执行z++
        //左边的条件:z==42,z++  z==42成立,z++变成43
        //中间虽然是短路与,因为左边现在是true,右边还要看
        //右边 y==true   不成立
        //true && false 结果为false
        if((z++==42)&&(y==true))    z++;

        //左边为x=false,赋值  结果就为false
        //中间虽然为短路或,因为左边是false,右边继续看
        //++z,z==45  ++z变成44,z==45是否成立,不成立
        //false || false  结果为false
        if((x=false) || (++z==45))  z++;

        System. out.println("z="+z);//44
    }
}
class  Test4_2  {
    public static void main (String []  args)  {
        boolean x = true;
        boolean y = false;
        short z = 42;

        //如果if(y=true)条件成立,接着判断if((z++==42)&&(y==true))    z++;    
        //如果不成立,if((z++==42)&&(y==true))    z++;    不看的
        /*
        if(y = true)

        if((z++==42)&&(y==true))    z++;    

        if((x=false) || (++z==45))  z++;
        */

        //标准
        //y=true赋值,y就被修改为true,if(true)成立
        if(y=true){
            //左边:z==42,z++  成立,z变成43
            //&&短路与,不满足短路的情况,右边继续
            //y==true 成立
            //true && true,结果为true
            if((z++==42)&&(y==true)){
                //z++变成44
                z++;
            }
        }
        //左边:x=false不成立
        //中间虽然是短路或,但是没满足短路的情况,右边继续
        //++z,z==45  ++z变成45,z==45成立
        if((x=false) || (++z==45)){
            //z++,变成46
            z++;
        }
        System. out.println("z="+z);//46
    }
}

2.10.5 条件运算符(三目运算符/三元运算符)

格式

条件表达式?结果1:结果2

条件运算符计算方式:

  • 条件判断的结果是 true,条件运算符整体结果为结果 1,赋值给变量
  • 判断条件的结果是 false,条件运算符整体结果为结果 2,赋值给变量
    public static void main(String[] args) {
      int i = (1==2 ? 100 : 200);
      System.out.println(i);//200
      int j = (3<=4 ? 500 : 600);
      System.out.println(j);//500
    }
    

练习

1、声明三个整型的变量,a,b,c,要求找出最大值
2、声明一个整型的变量,判断它是正数还是负数,还是0

2.10.6运算符优先级

image.png
提示说明:

  • 表达式不要太复杂
  • 先算的使用()

大体的排序:算术->位—>比较—>逻辑—>三元—>赋值