跳到主要内容

第5章-运算符

概述

  • 运算符是编程语言中非常重要的语法

  • 使用运算符将字面量、变量等元素组合在一起后,称之为表达式;并且,表达式也可以再使用运算符进行组合,形成新表达式,如(5>3)&(10<20)|isSuperMan

  • 一般多针对8种基本数据类型和字符串类型

  • 变量定义完成后,一般都会与其他变量进行一起计算,以完成程序的逻辑;其中的计算就需要用到各种运算符

    运算符-所有运算符

    常用运算符

算术运算符

  • 主要用于进行传统数学计算,进行数学计算,针对的数据类型一般为整数型、浮点型等数据类型

  • 运算符:+、-、*、/、%、++、--

  • 应用实例

    • 实例1,基本算术运算,加、减、乘、除和取余;

      注意:操作数如果是整数,则除法是整除

      package com.bjpowernode.demo;

      /**
      * 基本算术运算
      */
      public class OperatorDemo {
      public static void main(String[] args) {
      //定义变量
      int first = 10;
      int second = 3;

      //算术运算
      System.out.println(first + second); //加
      System.out.println(first - second); //减
      System.out.println(first * second); //乘
      System.out.println(first / second); //除,注意是整除
      System.out.println(first % second); //取余
      }
      }
    • 实例2,自增1和自减1

      注意:在变量前和在变量后效果不同

      在前:先进行自增或自减,当前代码行使用自增或自减后的值

      在后:当前代码行使用自增前或自减前的值,下一行代码使用自增或自减后的值

      package com.bjpowernode.demo;

      /**
      * 自增、自减算术运算
      */
      public class OperatorDemo {
      public static void main(String[] args) {
      //定义变量
      int first = 1;

      //自增1,分别注释,对比查看效果
      System.out.println(++first); //在前
      System.out.println(first++); //在后


      //定义变量
      int second = 1;

      //自减1,分别注释,对比查看效果
      System.out.println(--second); //在前
      System.out.println(second--); //在后
      }
      }

【练习】

  1. 练习实例内容,完成代码编写,掌握基本算术运算符的使用、自增1和自减1在前和在后的差异
  2. 编写程序,计算任意三位整数各位之和,如整数123各位之和是1+2+3,结果为6,234各位之和是2+3+4,结果为9

赋值运算符

  • 主要用于对变量进行赋值;其中=可用于基本数据类型变量和引用数据类型变量赋值,其余的主要针对数值型、浮点型等基本数据类型

  • 运算符:=、+=、-=、*=、/=、%=

  • 变量定义时,直接赋值使用的等于号”=“就是赋值运算符

  • 结合算术运算符中的+、-、*、/、%,可以组织更加简便的赋值运算符

  • 应用实例

    • 实例1,赋值运算符

      package com.bjpowernode.demo;

      /**
      * 赋值算术运算
      */
      public class OperatorDemoDemo {
      public static void main(String[] args) {
      //定义变量,使用赋值运算符
      long first = 10;

      //其他赋值运算符
      //加等于
      first += 3;//相当于first = first +3;
      System.out.println(first);
      //减等于
      first = 10; //重新设置变量值
      first -= 3;
      System.out.println(first);
      //乘等于
      first = 10; //重新设置变量值
      first *= 3;
      System.out.println(first);
      //除等于
      first = 10; //重新设置变量值
      first /= 3;
      System.out.println(first);
      //取余等于
      first = 10; //重新设置变量值
      first %= 3;
      System.out.println(first);
      }
      }
    • 实例2,first += 3first = first + 3两种方式的差别;一般认为没有差别,但使用字面量参与运算时,还是有小差异

      package com.bjpowernode.demo;

      /**
      * 赋值算术运算中first+=3与first=first+3的区别
      */
      public class OperatorDemoDemo {
      public static void main(String[] args) {
      //定义变量,使用赋值运算符
      byte first = 10;

      //赋值运算符,简写方式
      first += 3; //正常,字面量3默认是int类型,但作为赋值运算符,会进行自动类型转型
      System.out.println(first);

      //算术运算符配置赋值运算符,非简写方式
      first = first + 3; //异常,因为字面量默认是int类型
      System.out.println(first);

      }
      }

【练习】

  1. 练习演示内容,完成代码编写;掌握赋值运算符的使用
  2. 编写程序,要求如下
    1. 定义long类型变量longVariable,赋初始值为10
    2. 使用赋值运算符在原值上加50,并输出变量
    3. 使用赋值运算符在原值上减25,并输出变量
    4. 使用赋值运算符在原值上乘2,并输出变量
    5. 使用赋值运算符在原值上除3,并输出变量
    6. 使用赋值运算符在原值上对10进行取余,并输出变量

关系运算符

  • 多用于数值的比较,一般多用于数值型、浮点型的数值比较;其中的==也用于引用数据类型的比较,但比较的是地址

  • 运算符:>、>=、<、<=、==、!=

  • 关系运算符计算后的返回值为boolean型,即值只为true或false

  • 注意:===是完全不同的

  • 特殊的==运算符

    • 即可比较8种基本数据类型,也可比较引用数据类型
    • 比较基本数据类型比较实际值
    • 比较引用数据类型比较引用在堆中指向的地址是否相同(先记住,后面还有讲解)
  • 应用实例

    • 实例1,关系运算符;注意:下面使用提int类型,使用byte、short、long、float、double有类似的效果

      package com.bjpowernode.demo;

      /**
      * 关系运算符
      */
      public class OperatorDemoDemo {
      public static void main(String[] args) {
      //定义变量
      int first = 10; //换其他值尝试效果,如20、30
      int second = 10; //换其他值尝试效果,如25、35

      //关系运算
      System.out.println(first > second);
      System.out.println(first >= second);
      System.out.println(first < second);
      System.out.println(first <= second);
      System.out.println(first == second);
      boolean result = first != second;
      System.out.println(result);
      }
      }

【练习】

  1. 练习演示内容,完成代码编写;掌握关系运算符的使用

逻辑运算符

  • 主要用于boolean类型的比较

  • 逻辑运算符计算后的返回值还是boolean型,即值只为true或false

  • 运算符:见下表

    运算符-逻辑运算符

  • 逻辑运算符中的与、或,分为短路非短路两种,略有差异

  • 应用实例

    • 实例1,正常使用逻辑运算符

      package com.bjpowernode.demo;

      /**
      * 逻辑运算符
      */
      public class OperatorDemoDemo {
      public static void main(String[] args) {
      System.out.println("-----字面量逻辑运算-----");

      //字面量逻辑运算
      //与
      System.out.println(true & true);
      System.out.println(true & false);
      System.out.println(false & true);
      System.out.println(false & false);
      //或
      System.out.println(true | true);
      System.out.println(true | false);
      System.out.println(false | true);
      System.out.println(false | false);
      //非
      System.out.println(!true);
      System.out.println(!false);
      //异或
      System.out.println(true ^ true);
      System.out.println(true ^ false);
      System.out.println(false ^ true);
      System.out.println(false ^ false);

      System.out.println("-----变量逻辑运算-----");

      //变量逻辑运算
      boolean first = true;
      boolean second = false;
      //与
      System.out.println(first & second);
      //或
      System.out.println(first | second);
      //非
      System.out.println(!first);
      System.out.println(!second);
      //异或
      System.out.println(first ^ second);

      System.out.println("-----表达式逻辑运算-----");

      //表达式逻辑运算
      int one = 5;
      int two = 3;
      //与
      System.out.println((one > two) & (10 < 20));
      //或
      System.out.println((one > two) | (one != 0) | (two == 5));
      //非
      System.out.println(!(one > two));
      System.out.println(!(one < two));
      //异或
      System.out.println((one < two) ^ (one > two));
      }
      }
    • 实例2,逻辑与(&)与短路与(&&)区别;|和||类似

      package com.bjpowernode.demo;

      /**
      * 逻辑与(&)和短路与(&&)区别
      */
      public class OperatorDemoDemo {
      public static void main(String[] args) {
      //逻辑与;注意,当&左边为false时,由于是与运算,整个表达式一定为假,继续计算后面的表达式没有意义;但此时由于是逻辑与,还是【会】继续计算++testVariable<100,并且testVariable【会】进行自增1
      int testVariable = 0;
      boolean result = false & (++testVariable < 100);
      System.out.println(testVariable);

      //短路与;注意,当&&左边为false时,由于是与运算,整个表达式一定为假,继续计算后面的表达式没有意义;此时【不会】继续计算++testVariable<100,testVariable【不会】进行自增1,效率更高
      testVariable = 0;
      result = false && (++testVariable < 100);
      System.out.println(testVariable);
      }
      }

【练习】

  1. 练习实例内容,完成代码编写;掌握逻辑运算符的使用,掌握逻辑与(或)与短路与(或)差异

位运算符【扩展】

  • 主要用于整数型数据进行运算

  • 先将十进制转换为二进制,然后按二进制位进行运算

  • 运算符:&、|、~、^、<<、>>、>>>

  • 应用实例

    • 实例1,正常使用

      package com.bjpowernode.demo;

      /**
      * 位运算符
      */
      public class OperatorDemoDemo {
      public static void main(String[] args) {
      //变量定义
      int first = 3;
      int second = 5;

      //输出二进制形式,Integer为包装类,使用其toBinaryString方法输出二进制字符串形式
      System.out.println(Integer.toBinaryString(first)); //输出为11,前面补齐0,即二进制的00000011
      System.out.println(Integer.toBinaryString(second)); //输出为101,前面补齐0,即二进制的00000101

      //位运算
      //按位与
      int result = first & second;
      System.out.println(Integer.toBinaryString(result)); //按位与后为1,前面补齐0,即二进制的00000001
      //按位或
      result = first | second;
      System.out.println(Integer.toBinaryString(result)); //按位或后为111,前面补齐0,即二进制的00000111
      //按位非
      result = ~second;
      System.out.println(Integer.toBinaryString(result)); //按位非后为010,前面补齐0,即二进制的00000010
      //按位异或
      result = first ^ second;
      System.out.println(Integer.toBinaryString(result)); //按位非后为110,前面补齐0,即二进制的00000110
      //左移2位
      result = first << 2;
      System.out.println(Integer.toBinaryString(result)); //左移后为1100,前面补齐0,即二进制的00001100
      //右移2位
      result = first >> 2;
      System.out.println(Integer.toBinaryString(result)); //右移后为0,前面补齐0,即二进制的00000000
      }
      }

【练习】

  1. 运行示例代码,了解位运算符的使用

条件运算符

  • 主要用于简单真假逻辑计算,类似于常见的二选一

  • 运算符:? :

  • 也称之为三目运算符

  • 与后面学习的if...else...相类似,可以理解为一种简写方式

  • 格式:条件表达式?表达式1:表达式2,其中

    • ?与:,是条件运算符关键字
    • 条件表达式,问号(?)前面的是条件表达式,表达式计算后的返回值必须为boolean类型
    • 如果条件表达式计算结果为true,执行表达式1
    • 如果条件表达式计算结果为false,执行表达式2
    • 注意:表达式1、表达式2可以是字面量、表达式,且计算完成后的结果必须为相同类型
  • 另外,这3个表达式,一般都不能超过一行语句,如果超过,换if...else...实现

  • 常见使用方式

    • 二选一,如isSuperMan == true ? "超人":"普通人";
    • 多选一,需要使用嵌套条件运算符,如age<18?"少年":(age<30?"青年":"老年");
  • 示例:isSuperMan == true ? "超人":"普通人"

  • 应用实例

    • 实例1,二选一

      package com.bjpowernode.demo;

      /**
      * 条件运算符
      */
      public class OperatorDemoDemo {
      public static void main(String[] args) {
      //变量定义
      int age = 16; //尝试修改值为15、19

      //使用条件运算符
      String result = age >= 18 ? "成年人" : "未成年人";
      //输出
      System.out.println(result);
      }
      }
    • 实例2,三选一

      package com.bjpowernode.demo;

      /**
      * 条件运算符
      */
      public class OperatorDemoDemo {
      public static void main(String[] args) {
      //变量定义
      int age = 18; //尝试修改值为15、19、35

      //使用条件运算符
      String result = age <= 18 ? "少年" : (age <= 30 ? "青年" : "老年");

      //输出
      System.out.println(result);
      }
      }

【练习】

  1. 练习实例内容,完成代码编写;掌握条件运算符的使用
  2. 编写程序,判读整数是奇数还是偶数,要求如下:
    1. 定义一个int类型变量,并赋值,可以是任意整数,如10、11
    2. 结合算术运算符、条件运算符,判断变量值是奇数,还是偶数,并输出
    3. 如int intVariable = 10;,则输出”偶数”;如果int intVariable = 11;,则输出“奇数“

字符串连接运算符

  • 主要用于字符串连接,通常可实现字符串与字符串、8种基本数据类型、对象进行连接,形成一个新的字符串

  • 运算符:+

  • 应用实例

    • 实例1,字符串连接字符串

      package com.bjpowernode.demo;

      /**
      * 字符串连接运算符,字符串连接字符串
      */
      public class OperatorDemoDemo {
      public static void main(String[] args) {
      //变量定义
      String firstName = "尼古拉斯";
      String lastName = "赵四";

      //使用字符串连接运算符
      String fullName = firstName + "." + lastName;
      //输出
      System.out.println(fullName);
      }
      }
    • 实例2,字符串连接基本数据类型

      注意:字符串连接运算符+也遵守从左到右的计算顺序,字符串所在位置左边还是会进行普通的算术运算

      package com.bjpowernode.demo;

      /**
      * 字符串连接运算符,字符串连接基本数据类型
      */
      public class OperatorDemoDemo {
      public static void main(String[] args) {
      //变量定义
      String name = "王大拿";
      int baseSalary = 5000; //基本工资
      int overTimeHours = 20; //加班小时
      double overTimeHourWage = 10.5; //加班时薪

      //输出工资信息
      //方式1,拼接的字符串name之前没有基本数据类型,后面所有+处理都转字符串
      System.out.println(name + "的基本工资是:" + baseSalary + ",加班小时数:" + overTimeHours + ",加班时薪:" + overTimeHourWage + ",实发工资:" + baseSalary + overTimeHours * overTimeHourWage);
      //方式2,拼接的字符串"是"之前有基本数据类型,前面所有+都处理成算术运算,,后面所有+处理都转字符串
      System.out.println(baseSalary + overTimeHours * overTimeHourWage + "是" + name + "的实发工资,他的基本工资是:" + baseSalary + ",加班小时数:" + overTimeHours + ",加班时薪:" + overTimeHourWage);
      }
      }

【练习】

  1. 练习实例内容,完成代码编写;掌握字符串连接运算符的使用,掌握字符串连接各种数据类型的特点

其他运算符

  • instanceof,主要用于检查对象是否是某种类型,在面向对象阶段会讲解
  • new,主要用于根据类生成对象,在面向对象阶段会讲解

优先级

  • 优先级排行

    • ++,- -
    • 括号
    • *,/ ,% (同一优先级,从左至右)
    • +,- (同一优先级,从左至右)
  • 注意点:同一优先级运算符的运算顺序为:从左至右,运算复杂的时候要一步步拆解运算。

  • 建议

    • 不要把一个表达式写得过于复杂,可以分步来写
    • 少利用优先级特点,可读性差
    • 多使用括号()来控制运算顺序

注意事项

  • 所有运算符都是半角字符,要注意与中文的全角字符区分
  • 所有运算符都是关键字,不能用于自定义标识符

System.in

  • 标准输入流,用于从控制台(命令行)接收输入内容

  • 但,使用System.in读取数据都为字节,不方便快速转换为8种基本数据类型

  • Java中提供了Scanner类,使用System.in进行包装,能实现各种数据从控制台快速读取

  • 其特点是:

    • 读取时,程序会中断等待从控制台读取完成,读取完成后,程序再继续执行
    • 读取完成的标志,是在控制台输入回车
  • Scanner对象有多个方法

    • next,接收输入一行文本,即String类型数据
    • nextInt,接收输入一个int类型数据
    • nextDouble,接收输入一个double类型数据
    • nextBoolean,接收输入一个boolean类型数据
    • ...
  • 应用实例

    • 实例1,接收控制台输入学生信息

      package com.bjpowernode.demo;

      import java.util.Scanner;

      /**
      * Scanner
      */
      public class ScannerDemo {
      public static void main(String[] args) {
      //定义变量
      int no; //学号,整型
      String name; //姓名,字符串类型
      double weight; //体重,double类型
      boolean isMale; //是否为男性,boolean类型

      //定义Scanner对象,使用System.in做构造参数
      Scanner scanner = new Scanner(System.in);

      //使用scanner对象读取数据到变量,并结合标准输出进行提示,提升体验
      System.out.println("-----请输入学生信息-----");
      System.out.print("请输入学号:");
      no = scanner.nextInt(); //读取学号
      System.out.print("请输入姓名:");
      name = scanner.next(); //读取姓名
      System.out.print("请输入体重:");
      weight = scanner.nextDouble(); //读取体重
      System.out.print("是否为男性:");
      isMale = scanner.nextBoolean(); //读取是否为男性

      //输出输入内容
      System.out.println("-----你输入的学生信息如下-----");
      System.out.println("学号:" + no);
      System.out.println("姓名:" + name);
      System.out.println("体重:" + weight);
      System.out.println("是否为男性:" + isMale);
      }
      }

【练习】

  1. 练习实例内容,完成代码编写
  2. 编写程序,要求如下
    1. 定义boolean类型变量isLearningTime,用于保存是否为上课时间
    2. 接收输入是否为上课时间,输入的为字符串,如果输入”是“,isLearningTime赋值为true,如果输入其他内容,isLearningTime赋值为false
    3. 输出isLeaningTime的值

实战和作业

  1. 提问

    1. 下面的代码正确吗?为什么?可以使用什么运算符替代?

      //变量定义
      byte variable = 5;

      //算术运算
      variable = variable + 10;
    2. 下面的代码输出什么?如果想实现一个算术运算输出,怎么改?

      //变量定义
      int first = 10;
      double second = 3.0;

      //输出
      System.out.println(first + "+" + second + "=" + first + second);
  2. 编写程序,接收输入两个数,分别计算这两个数相加、相减、相乘、相除的结果,并输出

  3. 编写程序,接收输入一个整数,判断其是正数、负数,还是0,如:

    1. 输入-3,输出"-3是负数。"
    2. 输入3,输出"3是正数。"
    3. 输入0,输出"0是零。"
  4. 编写程序,实现两个变量值交换,要求

    1. 从控制台接收两个变量的值,变量名分别为first、second,然后输出
    2. 交换两个变量的值,然后输出
    3. 【扩展】可尝试不使用第3个变量进行first、second两个变量值交换