Java基础06——运算符

Java中的运算符

  • 概念:运算符就是告诉程序执行特定的运算操作的符号。

  • Java中提供了六类运算符,分别是 赋值运算符算术运算符关系运算符逻辑运算符位运算符条件运算符

  • 学习目标:实现模拟幸运抽奖,关键步骤如下:

    1. 获取键盘输入的会员卡号。
    2. 将会员卡号存储在变量中。
    3. 使用运算符分解会员卡号,获得各位上的数字。
    4. 将分解后的数字相加,判断是否中奖。

一、赋值运算符

  • 赋值运算符=用于给变量指定变量值,并可以和算术运算符结合组成复合赋值运算。

  • 复合赋值运算符主要包括:+=-=*=/=%=

  • 示例:

    int a = 10;
    int b = 20;
    a = a + b;// 可以替代为 a += b;
    

    分析:推荐使用复合赋值运算符将a = a + b;换为a += b;便于程序编译处理,具有更好的性能。

二、算数运算符

  • 算术运算符包括+-*/%++--。如下所示:

    运算符 含义 范例 结果
    + 加法运算符 5+3 8
    - 减法运算符 5-3 2
    * 乘法运算符 5*3 15
    / 除法运算符 5/3 1
    % 取模(取余)运算符 5%3 2
    ++ 自增运算符 i=2;j=i++; i=3;j=2;
    -- 自减运算符 i=2;j=i--; i=1;j=2;
  • 注意:

    1. 除法运算符,如果两个操作数均是整数结果也为整数,会舍弃小数部分;如果两个操作数中有一个是浮点数,将进行自动类型转换,结果也是浮点数,保留小数部分。
    2. 对于取模运算符,如果两个操作处均是整数结果也是整数;如果两个操作数中有一个是浮点数结果也是浮点数,保留小数部分。
    3. 自增运算符,只有i++++i两种使用方式,他们的相同点是都相当于i = i + 1;不同点是i++是先进行表达式运算再加一,而++i是先加一再进行表达式运算。
  • 示例:使用/%运算符获取会员卡各位上的数字,得到分解后的数字之和。

    实现步骤:

    1. 4位会员卡号和10求余可得个位数。
    2. 4位会员卡号除以10再和10求余可得十位数。
    3. 4位会员卡号除以100再和10求余可得百位数。
    4. 4位会员卡号除以1000可得千位数。
    5. 计算各位之和。
    import java.util.Scanner;
    
    public class PB_Lucky {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);// System.in 代表键盘
            System.out.println("请输入4位会员卡号:");
            int cardId = input.nextInt();// 获取从键盘输入的一个整数,并赋值给 cardId 变量
            // 利用 "/" 和 "%" 运算符获得每位数字
            int gewei = cardId % 10;            // 分解获得个位
            int shiwei = cardId / 10 % 10;      // 分解获得十位
            int baiwei = cardId / 100 % 10;     // 分解获得百位
            int qianwei = cardId / 1000;        // 分解获得千位
            System.out.println("******************************************");
            // 利用 + 运算符计算数字之和
            int sum = gewei + shiwei + baiwei + qianwei;
            System.out.println("会员卡号:" + cardId);
            System.out.println("千位数 : " + qianwei);
            System.out.println("百位数 : " + baiwei);
            System.out.println("十位数 : " + shiwei);
            System.out.println("个位数 : " + gewei);
            System.out.println("各位之和:" + sum);
        }
    }
    

    输出结果:

    请输入4位会员卡号:
    1437
    ******************************************
    会员卡号:1437
    千位数 : 1
    百位数 : 4
    十位数 : 3
    个位数 : 7
    各位之和:15
    

三、关系运算符

  • 关系运算符有时又称比较运算符,用于比较两个变量或常量的大小。

  • 运算结果是布尔值,truefalse

  • Java中共有六个关系运算符,分别为:==!=><>=<=。如下所示:

    运算符 含义 范例 结果
    == 等于 5==6 false
    != 不等于 5!=6 true
    > 大于 5>6 false
    < 小于 5<6 true
    >= 大于等于 5>=6 false
    <= 小于等于 5<=6 true
  • 注意:

    1. =为赋值运算符,==为等于运算符。
    2. ><>=<=只支持数值类型的比较。
    3. ==!=支持所有数据类型的比较,包括数值类型、布尔类型、引用类型。
    4. 关系表达式的结果为布尔值。
    5. ><>=<=优先级别高于==!=
  • 示例:根据会员卡各位上的数字之和判断用户是否中奖。

    import java.util.Scanner;
    
    public class PB_Lucky {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);// System.in 代表键盘
            System.out.println("请输入4位会员卡号:");
            int cardId = input.nextInt();// 获取从键盘输入的一个整数,并赋值给 cardId 变量
            // 利用 "/" 和 "%" 运算符获得每位数字
            int gewei = cardId % 10;            // 分解获得个位
            int shiwei = cardId / 10 % 10;      // 分解获得个位
            int baiwei = cardId / 100 % 10;     // 分解获得个位
            int qianwei = cardId / 1000;        // 分解获得个位
            System.out.println("******************************************");
            // 利用 + 运算符计算数字之和
            int sum = gewei + shiwei + baiwei + qianwei;
            System.out.println("会员卡号:" + cardId);
            System.out.println("千位数 : " + qianwei);
            System.out.println("百位数 : " + baiwei);
            System.out.println("十位数 : " + shiwei);
            System.out.println("个位数 : " + gewei);
            System.out.println("各位之和:" + sum);
            // 判断是否中奖
            if (sum > 20) {
                System.out.println("会员卡号为" + cardId + "的会员,您中奖了!");
            } else {
                System.out.println("会员卡号为" + cardId + "的会员,您没有中奖。");
            }
        }
    }
    

    输出结果:

    请输入4位会员卡号:
    1234
    ******************************************
    会员卡号:1234
    千位数 : 1
    百位数 : 2
    十位数 : 3
    个位数 : 4
    各位之和:10
    会员卡号为1234的会员,您没有中奖。
    --------------------------------------------------------------------------------------
    请输入4位会员卡号:
    7896
    ******************************************
    会员卡号:7896
    千位数 : 7
    百位数 : 8
    十位数 : 9
    个位数 : 6
    各位之和:30
    会员卡号为7896的会员,您中奖了!
    

    If-else类型语句称为选择结构,后面的课程会学习,这里只要简单了解即可。

四、逻辑运算符

  • 逻辑运算符用于对两个布尔型操作数进行运算。其结果还是布尔值。逻辑运算符如下所示:

    运算符 含义 运算规则
    & 逻辑与 两个操作数都是true,结果才为true
    | 逻辑或 两个操作数一个为true,结果为true
    ^ 逻辑异或 两个操作数相同,结果为false;两个操作数不同,结果为true
    ! 逻辑反(逻辑非) 操作数为true,结果为false;操作数为false,结果为true
    && 短路与 运算规则同”&“,但短路
    || 短路或 运算规则同”|“,但短路
  • 注意:

    1. 操作数类型只能是布尔类型,操作结果也是布尔值。
    2. 优先级别:!>&>^>|>&&>||
    3. &&&的区别,当&&的左侧为false时,则将不会进行其右侧的表达式,即左false则false;无论任何情况,&两侧的表达式都会参与计算。
    4. |||的区别与&&&的区别类似。

五、位运算符

  • 位运算符及运算规则如下所示:

    运算符 含义 运算规则
    & 按位与 两个操作数都是1,结果才为1
    | 按位或 两个操作数有一个是1,结果为1
    ^ 按位异或 两个操作数相同,结果为0;两个操作数不同,结果为1
    ~ 安慰非/取反 操作数为1,结果为0;操作数为0,结果为1
    << 左移 右侧空位补0
    >> 右移 左侧空位补最高位,即符号位
    >>> 无符号右移 左侧空位补0
  • 示例:

    public class Test {
        public static void main(String[] args) {
           /*
           计算  5&6
           转化为二进制:
           5=0000 0101
           6=0000 0110
           5&6 = 0000 0100 转化十进制为 4
            */
            System.out.println("5&6=" + (5 & 6));// 4
    
            /*
           计算  7|8
           转化为二进制:
           7=0000 0111
           8=0000 1000
           7|8 = 0000 1111 转化十进制为 15
            */
            System.out.println("7|8=" + (7 | 8));// 15
    
            /*
           计算  3<<3
           转化为二进制:
           3=0000 0011
           3<<3 = 0001 1000 转化十进制为 24
            */
            System.out.println("3<<3=" + (3 << 3));// 24
    
             /*
           计算  16>>3
           转化为二进制:
           16=0001 0000
           16>>3 = 0000 0010 转化十进制为 2
            */
            System.out.println("16>>3=" + (16 >> 3));// 2
            
        }
    }
    
  • 提示:

    1. 一个整数每向左移动一位,其值扩大两倍。前提是移出位数不包含有效数字。
    2. 一个整数每向右移动一位,其值缩小1/2,前提是溢出位数不包含有效数字
    3. a=a*4a=a<<2的作用和结果是相同的,但是使用位运算符具有更快的速度。
    4. 位运算符对操作数以二进制为单位进行运算。
    5. 位运算的操操作数是整型数,包括:int、short、long、byte、char。
    6. 位运算的结果也是整型数,包括:int、long。
    7. 如果操作数是 char、byte、short,位运算前其值会自动晋升为 int, 运算结果也为int。

六、条件运算符

  • 条件运算符是Java中唯一的需要三个操作数的运算符,所以又称三目运算符或三元运算符。

  • 条件运算符的语法:

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

  • 在语法中:

    • 首先对条件进行判断如果结果为true,返回表达式1的值,如果条件为false,返回表达式2的值。

    • 如果条件结果为false,返回表达式2的值。

  • 示例:

    import java.util.Scanner;
    
    public class Test {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            int score = input.nextInt();// 获取键盘输入int
            // 三目运算符判断是否及格
            String result = score >= 60 ? "及格" : "不及格";
            // 输出结果
            System.out.println("成绩" + result);
        }
    }
    

    提示:条件表达式的功能和 if-else 选择结构相似,可以转变为 if-else 语句。

优先级和结合性

  • Java中的各种运算符都有自己的优先级和结合性,所谓优先级就是在表达式运算中的运算顺序,优先级越高在表达式中运算顺序越靠前。

  • 结合性可以理解为运算的方向,大多数运算符的结合性都是从左向右,即从左向右依次进行运算。

  • 各种运算符的优先级如下所示,优先级比从上而下竹,逐级降低。

    优先级 运算符 结合性
    1 ()、[] 从左向右
    2 !、~、++、-- 从右向左
    3 *、/、% 从左向右
    4 +、- 从左向右
    5 <<、>>、>>> 从左向右
    6 <、<=、>、>=、instanceof 从左向右
    7 ==、!= 从左向右
    8 & 从左向右
    9 ^ 从左向右
    10 | 从左向右
    11 && 从左向右
    12 || 从左向右
    13 ?: 从右向左
    14 =、+=、-=、*=、/=、%=、&=、|=、^=、~=、<<=、>>=、>>>= 从右向左
  • 提示:

    1. 优先级别最低的赋值运算符,其次是条件运算符。
    2. 单目运算符包括!~++--,优先级别高。
    3. 可以通过()控制表达式的运算顺序,()优先级别最高。
    4. 总体而言,优先顺序为:算术运算符>关系运算符>逻辑运算符。
    5. 结合性为从右向左的只有赋值运算符、三目运算符和单目运算符(一个操作数)。
posted @ 2022-01-17 17:55  凶巴巴17  阅读(170)  评论(0编辑  收藏  举报