Java讲课笔记05:运算符与表达式

文章目录

零、本讲学习目标

1、掌握Java中各种运算符的使用

2、掌握如何正确书写Java表达式

运算符就是专门用于告诉程序执行特定运算或逻辑操作的符号。表达式是指由常量、变量和运算符组成的一个算式。编写程序对数据进行处理,其实处理就是对数据实施各种各样的运算,搞懂运算符与表达式是我们编写程序的基础性工作,本次讲课笔记通过案例讲解各种运算符的用法以及正确书写Java表达式的注意事项。
在这里插入图片描述

一、算术运算符(Arithmetic Operator)

Java中的算术运算符就是用来处理四则运算的符号,也是最简单和最常用的运算符号。

1、分类说明表

运算符 运算 范例 结果
+ 正号 +3 3
- 负号 b = 4; -b; -4
+ 5 + 5 10
- 6 - 4 2
* 3 * 4 12
/ 除(即算术中整除的结果) 32 / 5 6
% 取模(即算术中的求余数) 32 % 5 2
++ 自增(前) a = 2; b = ++a; a = 3; b = 3;
++ 自增(后) a = 2; b = a++; a = 3; b = 2;
自减(前) a = 2; b = --a; a = 1; b = 1;
自减(后) a = 2; b = a–; a = 1; b = 2;

2、注意事项

  • 在进行自增(++)和自减(–)的运算时,如果运算符(++或–)放在操作数的前面则是先进行自增或自减运算,再进行其他运算。反之,如果运算符放在操作数的后面则是先进行其他运算再进行自增或自减运算。
  • 在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数;如果除法运算有小数参与,得到的结果会是一个小数。
  • 在进行取模(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。
  • 注意运算优先级,(取负) -->*,/,% -->+,-。 如果要改变运算次序,那么需要加括号。

3、案例演示

任务1、计算成绩差与平均成绩

输入三科STB、SQL、JAVA的成绩,计算SQL与JAVA的成绩差以及三科的平均分。

  • 一个程序包含四个部分:声明部分、输入部分、处理部分和输出部分,其中,处理部分是一个程序的核心,涉及解决问题的方法和步骤,即算法,在处理部分就会用到运算符、表达式与控制结构。
  • 输入各种类型的数据,需要实例化Scanner类,传一个参数System.in(标准字节输入流 - 键盘)。

在这里插入图片描述

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:计算成绩差与平均成绩
 * 作者:华卫
 * 日期:2020年3月4日
 */
public class Example501 {
    public static void main(String[] args) {
        // 声明部分
        double stb, java, sql, difference, average;
        Scanner sc = new Scanner(System.in);

        // 输入部分
        System.out.print("输入STB的成绩:");
        stb = sc.nextDouble();
        System.out.print("输入Java的成绩:");
        java = sc.nextDouble();
        System.out.print("输入SQL的成绩:");
        sql = sc.nextDouble();

        // 处理部分
        difference = java - sql;
        average = (stb + java + sql) / 3;

        // 输出部分
        System.out.println("==========================");
        System.out.println("STB\t\tJava\t\tSQL");
        System.out.println(stb + "\t" + java + "\t\t" + sql);
        System.out.println("==========================");
        System.out.println("Java与SQL的成绩差:" + difference);
        System.out.println("三门课程的平均分:" + average);
    }
}

运行程序,结果如下:
在这里插入图片描述
思考:如何设置平均分的小数位数?(比如保留到小数点后面两位。)
可以参看Java讲课笔记04:变量与常量里的案例程序Example409。
在这里插入图片描述
采用制表转义字符\t来控制输出项的间隔,可能最终每一列并非占据等宽,如何才能保证每一列占据等宽,并且左对齐呢?很简单,采用String.format()方法就可以搞定。

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:计算成绩差与平均成绩
 * 作者:华卫
 * 日期:2020年3月4日
 */
public class Example501_ {
    public static void main(String[] args) {
        // 声明部分
        double stb, java, sql, difference, average;
        Scanner sc = new Scanner(System.in);

        // 输入部分
        System.out.print("输入STB的成绩:");
        stb = sc.nextDouble();
        System.out.print("输入Java的成绩:");
        java = sc.nextDouble();
        System.out.print("输入SQL的成绩:");
        sql = sc.nextDouble();

        // 处理部分
        difference = java - sql;
        average = (stb + java + sql) / 3;

        // 输出部分
        System.out.println("=======================");
        System.out.println(String.format("%-9s%-9s%-9s","STB", "Java", "SQL"));
        System.out.println(String.format("%-9.1f%-9.1f%-9.1f", stb, java, sql));
        System.out.println("=======================");
        System.out.println("Java与SQL的成绩差:" + difference);
        System.out.println("三门课程的平均分:" + String.format("%.2f", average));
    }
}

运行程序,查看结果:
在这里插入图片描述
说明:String.format("%-9s%-9s%-9s","STB", "Java", "SQL")

  • %-9s —— 输出字符串数据,宽度为9,不足时在右边补足空格,用于产生左对齐效果;数据数据实际位数超过指定位数,按实际位数输出
  • %9s —— 输出字符串数据,宽度为9,不足时在左边补足空格,用于产生右对齐效果;数据数据实际位数超过指定位数,按实际位数输出
  • 如果要输出整型数据,那么要用%d,当然也可以指定宽度以及对齐方式,比如%8d、%-8d(总位数是8位,输出数据实际位数超过指定位数,按实际位数输出,不足时就补空格)
  • 如果要输出浮点型数据,那么要用%f,当然也可以指定宽度以及对齐方式,比如%9.1f、%-9.1f(总位数是9位,保留一位小数)

课堂练习:编程处理带余除法。

格式:8 ÷ 5 = 1...3

任务2、打印购物小票

打印购物小票并计算购物积分,结算时打印购物小票,计算此次购物积分购买三种商品,并且有折扣,付费以及找钱票。
在这里插入图片描述

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:结算时打印购物小票,计算此次购物积分
 *      购买三种商品,并且有折扣,付费以及找钱
 * 作者:华卫
 * 日期:2020年3月4日
 */
public class Example502 {
    public static void main(String[] args) {
        // 三种商品的单价
        double price1, price2, price3;
        // 三种商品的购买数量
        int amount1, amount2, amount3;
        // 购物折扣
        double discount = 0.8;
        // 购物总金额
        double money;
        // 实际交费
        double pay;
        // 应找钱
        double change;
        // 购物积分
        int points;
        // 扫描器
        Scanner sc = new Scanner(System.in);

        // 输入部分
        System.out.print("输入T恤的单价:");
        price1 = sc.nextDouble();
        System.out.print("输入T恤购买数量:");
        amount1 = sc.nextInt();
        System.out.print("输入网球鞋的单价:");
        price2 = sc.nextDouble();
        System.out.print("输入网球鞋购买数量:");
        amount2 = sc.nextInt();
        System.out.print("输入网球拍的单价:");
        price3 = sc.nextDouble();
        System.out.print("输入网球拍购买数量:");
        amount3 = sc.nextInt();
        System.out.print("顾客实际交费:");
        pay = sc.nextDouble();

        // 处理部分
        money = (price1 * amount1 + price2 * amount2 + price3 * amount3) * discount; // 计算购物总金额
        change = pay - money; // 计算找钱
        points = (int) (money / 33); // 计算购物积分

        // 输出部分
        System.out.println("************消费单**********");
        System.out.println("购买物品\t\t单价\t个数\t金额");
        System.out.println("T恤\t\t\t" + price1 + "\t" + amount1 + "\t\t¥" + price1 * amount1);
        System.out.println("网球鞋\t\t" + price2 + "\t" + amount2 + "\t\t¥" + price2 * amount2);
        System.out.println("网球拍\t\t" + price3 + "\t" + amount3 + "\t\t¥" + price3 * amount3);
        System.out.println();
        System.out.println("折扣:" + (int) (discount * 10) + "折");
        System.out.println("消费总金额:¥" + money);
        System.out.println("实际交费:¥" + pay);
        System.out.println("找钱:¥" + change);
        System.out.println("本次购物所获得的积分:" + points);
    }
}

运行程序,结果如下:
在这里插入图片描述

扫描二维码关注公众号,回复: 11266780 查看本文章

任务3、幸运抽奖 - 由卡号计算幸运数

输入会员卡号(4位数)、分解出各位数字,再把各位数字相加,得到幸运数字,然后利用幸运数字去抽奖。编写程序,如何由卡号得到幸运数字。

难点:如何把一个四位数拆分?
解决问题的思路:例如n = 3462
3426 = 3 * 1000 + 4 * 100 + 6 *10 + 2

除了个位数2之外,其余的各位数都能被10整除,那就意味着2是3462除以10的余数,怎么表示?3462 % 10 = 2

个位数得到之后,我们希望去掉个位数,把四位数变成三位数,然后就可以采用类似的方法得到三位数的末尾数,其实就是四位数的十位数;那么怎么才能得到这样的三位数呢?3462 / 10 = 346

346 = 3 * 100 + 4 * 10 + 6 怎么得到末尾数呢? 346 % 10 = 6
然后又把346变成34,怎么做?346 / 10 = 34

34 = 3 * 10 + 4,怎么得到末尾数呢?34 % 10 = 4
然后又34变成3,怎么做?34 / 10 = 3

在这里插入图片描述
在这里插入图片描述

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:由会员卡号计算幸运数
 *      幸运数等于会员卡号各位数字之和
 * 作者:华卫
 * 日期:2020年3月4日
 */
public class Example503 {
    public static void main(String[] args) {
        /* 声明部分 */
        int id; // 会员卡号
        int x1, x2, x3, x4; // 个位数、十位数、百位数、千位数
        int luckyNumber; // 幸运数字
        Scanner sc = new Scanner(System.in);  // 扫描器对象

        /* 输入部分 */
        System.out.print("输入会员卡号(四位数):");
        id = sc.nextInt(); // 从键盘接收一个整数

        /* 处理部分 */
        x1 = id % 10; // 取个位数
        x2 = id / 10 % 10; // 取十位数
        x3 = id / 100 % 10; // 取百位数
        x4 = id / 1000; // 取千位数
        luckyNumber = x1 + x2 + x3 + x4; // 计算幸运数字

        /* 输出部分 */
        System.out.println("你的幸运数:" + luckyNumber);
    }
}

在这里插入图片描述
思考题: 如果输入的卡号不是四位数,程序会出现什么情况?应该如何改善这个程序,只处理输入四位数的情况?我们这个拆分数字的方法能否推广到任意多位数呢?

任务4、演示自增与自减运算

  • 自增有前自增与后自增两种情况。前自增,++a,先增后用;后自增,a++,先用后增。
  • 自减有前自减与后自减两种情况。前自减,–a,先减后用;后自减,a–,先用后减。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
课堂练习:给出下列代码的执行结果。

public class Example503__ {
    public static void main(String[] args) {
        int a = 10, b = 20, c, d;

        c = a++ + b--;
        d = ++a + --b;

        System.out.println("c = " + c);
        System.out.println("d = " + d);
    }
}

自增与自减运算,主要会用在循环结构里的更新条件,可以参看下一讲的循环结构案例。
在这里插入图片描述
在这里插入图片描述

二、赋值运算符(Assignment Operator)

赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量。它将运算符右边的值赋给左边的变量。

1、分类说明表

运算符 运算 范例 结果
= 赋值 a = 3; b = 2; a = 3; b = 2;
+= 加等于 a = 3; b = 2; a += b; a = 5; b = 2;
-= 减等于 a = 3; b = 2; a -= b; a =1; b = 2;
*= 乘等于 a = 3; b = 2; a *= b; a = 6; b = 2;
/= 除等于 a = 3; b = 2; a /= b; a = 1; b = 2;
%= 模等于 a = 3; b = 2; a %= b; a = 1; b = 2;

2、注意事项

  • 在Java中可以通过一条赋值语句对多个变量进行赋值。
  • 在赋值运算符中,除了“=”,其他的都是特殊的赋值运算符,以“+=”为例,x += 3就相当于x = x + 3,首先会进行加法运算x + 3,再将运算结果赋值给变量x。其余的-=、*=、/=、%=赋值运算符都可依此类推。

3、案例演示

(1)一次对多个变量赋值

package net.hw.lesson05;

/**
 * 功能:一次对多个变量赋值
 * 作者:华卫
 * 日期:2020年3月8日
 */
public class Example504 {
    public static void main(String[] args) {
        int a, b, c;

        a = b = c = 100;

        System.out.println("a = " + a);
        System.out.println("b = " + b);
        System.out.println("c = " + c);
    }
}

在这里插入图片描述

(2)演示复合赋值运算符

在这里插入图片描述

package net.hw.lesson05;

/**
 * 功能:演示复合赋值运算符
 * 作者:华卫
 * 日期:2020年3月8日
 */
public class Example505 {
    public static void main(String[] args) {
        int a = 10;
        System.out.println("a = " + a);
        a += 10;
        System.out.println("a = " + a);
        a -= 10;
        System.out.println("a = " + a);
        a *= 10;
        System.out.println("a = " + a);
        a /= 10;
        System.out.println("a = " + a);
        a %= 4;
        System.out.println("a = " + a);
    }
}

运行程序,结果如下:
在这里插入图片描述

三、关系运算符(Relational Operator)

比较运算符用来对两个数值或变量进行比较,其结果是布尔类型的true或false。

1、分类说明表

运算符 运算 范例 结果
== 相等于 200 == 100 false
!= 不等于 200 != 100 true
< 小于 200 < 100 false
> 大于 200 > 100 true
<= 小于等于 200 <= 100 false
>= 大于等于 200 >= 100 true

2、案例演示

任务1、比较两个学生成绩

在这里插入图片描述

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:比较两个同学成绩高低
 * 作者:华卫
 * 日期:2020年3月22日
 */
public class Example506 {
    public static void main(String[] args) {
        /* 声明部分 */
        int zhangScore; // 张三的成绩
        int liScore; // 李四的成绩
        boolean isHigher; // 张三是否比李四成绩高
        Scanner sc = new Scanner(System.in); // 接受键盘输入的扫描器对象

        /* 输入部分 */
        System.out.print("输入张三的成绩:");
        zhangScore = sc.nextInt();
        System.out.print("输入李四的成绩:");
        liScore = sc.nextInt();

        /* 处理部分 */
        isHigher = zhangScore > liScore;

        /* 处理与输出部分 */
        System.out.println("张三比李四成绩高吗?" + isHigher);
        if (isHigher) {
            System.out.println("张三要比李四成绩高!");
        } else {
            System.out.println("张三不比李四成绩高!");
        }
    }
}

运行程序,结果如下:
在这里插入图片描述
再运行程序,结果如下:
在这里插入图片描述
再运行程序,结果如下:
在这里插入图片描述

任务2、求解一元二次方程

对于一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0
假设二次项系数 a 0 a≠0
判别式 Δ = b 2 4 a c \Delta=b^2-4ac

I f Δ 0 T h e n x 1 = b + b 2 4 a c 2 a x 2 = b b 2 4 a c 2 a E l s e x 1 = b 2 a + 4 a c b 2 2 a i x 2 = b 2 a 4 a c b 2 2 a i E n d   I f If \quad \Delta \geq 0 \quad Then \\ \quad x_1=\displaystyle \frac{-b+\sqrt{b^2-4ac}}{2a} \\ \quad x_2=\displaystyle \frac{-b-\sqrt{b^2-4ac}}{2a} \\ Else \\ \quad x_1=\displaystyle -\frac{b}{2a}+\frac{\sqrt{4ac-b^2}}{2a}i \\ \quad x_2=\displaystyle -\frac{b}{2a}-\frac{\sqrt{4ac-b^2}}{2a}i \\ End \ If

此处,我们没有去计算复数解,只是提示用户此方程没有实数解。
在这里插入图片描述

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:求解一元二次方程
 * 作者:华卫
 * 日期:2020年3月22日
 */
public class Example507 {
    public static void main(String[] args) {
        // 声明部分
        double a, b, c, delta, x1, x2;
        Scanner sc = new Scanner(System.in);

        // 输入部分
        System.out.print("a = ");
        a = sc.nextDouble();
        System.out.print("b = ");
        b = sc.nextDouble();
        System.out.print("c = ");
        c = sc.nextDouble();

        // 处理部分 + 输出部分
        delta = b * b - 4 * a * c;
        if (delta >= 0) {
            x1 = (-b + Math.sqrt(delta)) / (2 * a);
            x2 = (-b - Math.sqrt(delta)) / (2 * a);
            System.out.println("x1 = " + x1);
            System.out.println("x2 = " + x2);
        } else {
            System.out.println("此方程没有实数解!");
        }
    }
}

运行程序,结果如下:
在这里插入图片描述
再运行程序,结果如下:
在这里插入图片描述
再运行程序,结果如下:
在这里插入图片描述
利用关系表达式可以表示一个简单条件,比如查找班上的男生,条件就是:性别 == “男”;查找成绩在90分以上的,条件就是:成绩 >= 90。

但是,大家思考一个问题,如何要查找成绩在90分以上的男生,那么该如何将查询条件写成Java表达式呢?

这就会用到Java的逻辑运算:非、与、或。

四、逻辑运算符(Logical Operator)

逻辑运算符是用于对布尔类型的值或表达式进行操逻辑判断的符号,其返回值类型是布尔类型。

1、分类说明表

运算符 运算 范例 结果
& a & b a和b都为true,结果为true,否则为false
| a | b a和b中只要有一个为true,则结果为true,否则为false
^ 异或 a ^ b a与b不同,结果为true,否则为false
! ! a 若a为false,结果为true,否则相反
&& 短路与 a && b a和b都为true,结果为true,否则为false
|| 短路或 a || b a和b中只要有一个为true,则结果为true,否则为false
  • 与运算真值表
&(&&) false true
false false false
true false true
  • 或运算真值表
|(||) false true
false false true
true true true
  • 异或运算真值表
^ false true
false false true
true true false
  • 非运算真值表
! false true
true false

2、注意事项

  • 逻辑运算符可以针对结果为布尔值的表达式进行逻辑运算。如:5 > 3 && 1 != 0的结果为true。
  • 运算符“&”和“&&”都表示与操作,当且仅当运算符两边的操作数都为true时,其结果才为true,否则结果为false。
  • “&”和“&&”的区别:在使用“&”进行运算时,不论左边为true或者false,右边的表达式都会进行运算。如果使用“&&”进行运算,当左边为false时,右边的表达式不会进行运算,因此“&&”被称作短路与。
  • 运算符“|”和“||”都表示或操作,当运算符任何一边的操作数或表达式为true时,其结果为true,当两边的值都为false时,其结果才为false。同与操作类似,“||”表示短路或,当运算符“||”的左边为true时,右边的表达式不会进行运算。
  • 运算符“^”表示异或操作,当运算符两边的布尔值相同时(都为true或都为false),其结果为false。当两边布尔值不相同时,其结果为true。

3、案例演示

任务1、闰年判断

在这里插入图片描述

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:闰年判断
 * 作者:华卫
 * 日期:2020年3月22日
 */
public class Example508 {
    public static void main(String[] args) {
        int year;
        boolean isLeapYear;
        Scanner sc = new Scanner(System.in);

        System.out.print("year = ");
        year = sc.nextInt();

        isLeapYear = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;

        if (isLeapYear)
            System.out.println(year + "是闰年。");
        else
            System.out.println(year + "是平年。");
    }
}

运行程序,结果如下:
在这里插入图片描述
再运行程序,结果如下:
在这里插入图片描述
其实闰年条件也可以修改一下,同时用到三种逻辑运算符。
在这里插入图片描述
注意:Java的 !、&(&&)、|(||) 对应 Python的not、and、or。

课堂练习:计算三角形面积

提示:
(1)利用三边关系定理判断能否构成三角形;
三边关系定理:任意两边之和大于第三边。
(2)如果能构成三角形,利用海伦公式来计算。
三边为 a , b , c a, b, c ,半周长 p = a + b + c 2 p=\displaystyle \frac{a+b+c}{2}
面积 a r e a = p ( p a ) ( p b ) ( p c ) area=\displaystyle \sqrt{p(p-a)(p-b)(p-c)}
在这里插入图片描述
在这里插入图片描述

五、位运算符(Bitwise Operator)

位运算符是针对二进制数的每一位进行运算的符号,它专门针对数字0和1进行操作。

1、分类说明表

运算符 运算 范例 结果
& 按位与 a & b a和b每一位进行“与”操作后的结果
| 按位或 a | b a和b每一位进行“或”操作后的结果
~ 取反 ~ a a的每一位进行“非”操作后的结果
^ 按位异或 a ^ b a和b每一位进行“异或”操作后的结果
<< 左移 a << b 将a左移b位,右边空位用0填充
>> 右移 a >> b 将a右移b位,丢弃被移出位,左边最高位用0或1填充
>>> 无符号右移 a >>> b 将a右移b位,丢弃被移出位,左边最高位用0填充
  • 按位与运算真值表
& 0 1
0 0 0
1 0 1
  • 按位或运算真值表
| 0 1
0 0 1
1 1 1
  • 按位异或运算真值表
^ 0 1
0 0 1
1 1 0
  • 取反运算真值表
~ 0 1
1 0

2、注意事项

位运算符本质都是针对二进制数0和1进行运算的,在使用位运算符时,都会先将操作数转换成二进制数的形式进行位运算,然后将得到的结果再转换成想要的进制数。其中,1表示true,0表示false。

3、案例演示

(1)按位与
在这里插入图片描述
(2)按位或
在这里插入图片描述
(3)逐位取反
在这里插入图片描述
(4)按位异或
在这里插入图片描述
(5)左移
在这里插入图片描述
(6)右移
在这里插入图片描述
(7)无符号右移
在这里插入图片描述
在这里插入图片描述

package net.hw.lesson05;

/**
 * 功能:演示位运算
 * 作者:华卫
 * 日期:2020年3月22日
 */
public class Example509 {
    public static void main(String[] args) {
        int a = 0b00000110;
        int b = 0b00001011;
        // 按位与
        System.out.println(Integer.toBinaryString(a) + " & " + Integer.toBinaryString(b) + " = " + Integer.toBinaryString(a & b));
        // 按位或
        System.out.println(Integer.toBinaryString(a) + " ! " + Integer.toBinaryString(b) + " = " + Integer.toBinaryString(a | b));
        // 逐位取反
        System.out.println("~" + Integer.toBinaryString(a) + " = " + Integer.toBinaryString(~a));
        // 按位异或
        System.out.println(Integer.toBinaryString(a) + " ^ " + Integer.toBinaryString(b) + " = " + Integer.toBinaryString(a ^ b));
        // 左移
        System.out.println(Integer.toBinaryString(b) + " << 1 = " + Integer.toBinaryString(b << 1));
        // 右移
        System.out.println(Integer.toBinaryString(b) + " >> 1 = " + Integer.toBinaryString(b >> 1));
        // 无符号右移
        System.out.println(Integer.toBinaryString(b) + " >>> 1 = " + Integer.toBinaryString(b >>> 1));
    }
}

运行程序,结果如下:
在这里插入图片描述
如何才能体现出右移与无符号右移的区别呢?
在这里插入图片描述

package net.hw.lesson05;

/**
 * 功能:演示右移与无符号右移的区别
 * 作者:华卫
 * 日期:2020年3月22日
 */
public class Example510 {
    public static void main(String[] args) {
        int a = 0b00000111111111111111111111111001;  // 正数
        int b = 0b10000111111111111111111111111001;  // 负数

        // 右移
        System.out.println(Integer.toBinaryString(a) + " >> 1 = " + Integer.toBinaryString(a >> 1));
        // 无符号右移
        System.out.println(Integer.toBinaryString(a) + " >>> 1 = " + Integer.toBinaryString(a >>> 1));
        // 右移
        System.out.println(Integer.toBinaryString(b) + " >> 1 = " + Integer.toBinaryString(b >> 1));
        // 无符号右移
        System.out.println(Integer.toBinaryString(b) + " >>> 1 = " + Integer.toBinaryString(b >>> 1));
    }
}

运行程序,结果如下:
在这里插入图片描述
最高位是符号位,0表示正数,1表示负数。
对于正数而言,右移与无符号右移结果相同。
对于负数而言,右移与无符号右移结果不同。

4、课堂练习

编程计算下列位运算结果:

123 & 34
223 | 34
323 ^ 34
4~23
532 >> 2
6-32 >> 2
732 >>> 2
8-32 >>> 2
94 << 3

在这里插入图片描述
大家可以对照一下Python的位运算:
在这里插入图片描述
大家可以看到,Python里除了没有无符号右移运算符之外,其余位运算符跟Java完全一样。

六、条件运算符

条件运算符也称作三元运算符(或三目运算符),由符号“? :”组合构成。对布尔类型的表达式判断,如果为true,就执行冒号“:”前面的表达式,否者执行后面的表达式。

1、语法格式

(boolean_expr) ? true_statement : false_statement;

先判断boolean_expr的值,如果为true,就执行表达式true_statement,否者执行表达式false_statement。

2、案例演示

任务1、计算分段函数值

y = { 3 x 2 1 x 0 ( 1 ) 2 x + 5 x < 0 ( 2 ) y=\begin{cases} 3x^2-1 &x\geq0 &(1)\\ -2x + 5 &x\lt 0 &(2)\\ \end{cases}

在这里插入图片描述

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:计算分段函数值
 * 作者:华卫
 * 日期:2020年3月22日
 */
public class Example511 {
    public static void main(String[] args) {
        double x, y;
        Scanner sc = new Scanner(System.in);

        System.out.print("x = ");
        x = sc.nextDouble();

        y = x >= 0 ? 3 * x * x - 1 : -2 * x + 5;

        System.out.println("y = " + y);
    }
}

运行程序,结果如下:
在这里插入图片描述
x = 1 x 0 y = 3 × 1 2 1 = 2 当x=1时,因为x\geq 0,所以y=3\times1^2-1=2

再运行程序,结果如下:
在这里插入图片描述
x = 1 x < 0 y = 2 × ( 1 ) + 5 = 7 当x=-1时,因为x\lt0,所以y=-2\times(-1)+5=7

思考题:不用条件运算符怎么计算分段函数值?

任务2、根据输入年龄提示不同信息

在这里插入图片描述

package net.hw.lesson05;

import java.util.Scanner;

/**
 * 功能:根据输入年龄提示不同信息
 * 作者:华卫
 * 日期:2020年3月22日
 */
public class Example512 {
    public static void main(String[] args) {
        // 声明部分
        int age;
        String msg;
        Scanner sc = new Scanner(System.in);

        // 输入部分
        System.out.print("输入你的年龄:");
        age = sc.nextInt();

        // 处理部分
        msg = age >= 18 ? "欢迎访问本网站~" : "未成年,旁边凉快去!";

        // 输出部分
        System.out.println(msg);
    }
}

运行程序,查看结果:
在这里插入图片描述
在这里插入图片描述
当然,不采用条件运算符,而采用双分支结构也可以搞定,如下图所示:
在这里插入图片描述

七、运算优先级

1、运算优先级概述

所有的数学运算都认为是从左向右运算的,Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。

乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。

一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。

Java 语言中运算符的优先级共分为 14 级,其中 1 级最高,14 级最低。在同一个表达式中运算符优先级高的先执行。表 1 列出了所有的运算符的优先级以及结合性。

2、运算优先级表

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

3、简要说明

如果实在搞不清默认的运算优先级,那么利用括号来改变运算次序,满足实际运算的需要即可。

八、Java表达式

1、表达式的概念

用运算符把常量或者变量连接起来符合Java语法的式子就称为表达式。

2、表达式的值与类型

  • 表达式的值就是表达式进行运算得到的结果
  • 表达式的数据类型就是表达式的值的数据类型

3、表达式的运算顺序

  • 应按照运算符的优先级从高到低的顺序进行
  • 优先级相同的运算符按照事先约定的结合方向进行

4、书写表达式的注意事项

  • 只能是单行书写
  • 不省略任何运算符
  • 只能使用圆括号

例如: x 1 = b + b 2 4 a c 2 a x_1=\displaystyle \frac{-b+\sqrt{b^2-4ac}}{2a}
上下标和分式全部要处理成单行,并且乘法运算符“*”不能省略:

x1 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);

又如: y = 4 + 3 { 5 x 3 [ 2 x 2 ( 6 x + 5 ) ] } y=4 + 3\{5x^3-[2x^2-(6x+5)]\} ,写成Java表达式只能使用圆括号,并且乘法运算符“*”不能省略:

y = 4 + 3 * (5 * x * x * x - (2 * x *x - (6 * x + 5)));

九、课后作业

1、将数学公式转换成Java表达式

  • 4 x 3 y 2 5 y 2 z 4 + 7 z 3 x 2 4x^3y^2-5y^2z^4+7z^3x^2
  • 4 x 2 + 5 x 1 2 x 2 3 x + 7 + 2 y 2 5 y + 1 3 y 2 + 7 y 3 \displaystyle \frac{4x^2+5x-1}{2x^2-3x+7}+\frac{2y^2-5y+1}{3y^2+7y-3}
  • 2 x 2 3 x 5 + x 3 x 3 + 5 x 2 4 x + 7 \displaystyle \frac{\sqrt{2x^2-3x-5}+ x-3}{x^3+5x^2-4x+7}

2、已知圆的半径,编程求圆的周长和面积

  • 要求定义圆周率符号常量PI = 3.141596
  • 要求圆周长与圆面积结果保留两位小数
  • 在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/104656226