我布置了作业,请大家留言解答。
3.5 运算符
问:在计算机编程语言中,运算符的概念是什么?
ChatGPT:运算符是编程语言中用于执行操作的符号或关键字。它们用于操作变量和值,执行特定的计算或逻辑操作。运算符的作用是允许程序员在代码中执行各种操作,从而实现对数据的处理、转换和控制流的灵活控制。
3.5.1 算术运算符
问:介绍算术运算符(Arithmetic Operators)
ChatGPT:算术运算符是用于执行基本数学运算的运算符,它们允许对数字进行加、减、乘、除等操作。算术运算符通常用于执行基本的数学计算,它们在编写程序时非常有用,例如在计算总和、平均值、增量或处理循环等方面。要注意,算术运算符的使用可能会导致溢出(当结果超过数据类型的表示范围时)或除零错误(在除法时分母为零)。在实际编码中,需要谨慎处理这些情况,以确保程序的正确性和稳定性。在数字的处理中几乎都会用到算术运算符号,算术运算符可以分为四则运算符、取余运算符和递增或递减运算符等几大类。具体说明如表3-3所示。
表3-3 算术运算符
类型 | 运算符 | 说明 | 举例 |
四则运算符 | + - * / | 加 减 乘 除法 | 10 + 10 = 20 10 – 10 = 0 10 * 10 = 100 10 / 10 = 1 |
取余运算符 | % | 取余 | 10 % 3 = 1 |
递增或递减 | ++ - - | 递增 递减 | a++等效于a = a + 1 a - -等效于a = a - 1 |
1.四则运算符
在Java程序中,基本运算符是使用最广泛的一种运算符。例如在下面的实例中,演示了使用基本运算符模拟计算你过去一个月在麦当劳兼职工资收入的过程。
范例3-8:工资计算器(范例文件:daima\3\3-8\...\Money.java)
麦当劳兼职生薪水待遇和小菜上月的出勤情况:
- 工作20天,每天3个小时,一个小时15元。
- 请假4天,每天扣除30元。
- 交通补助每天5元,每月按照实际出勤天数计算。
在本实例中定义了7个整型变量来计算工资收入,代码如下:
public class Money {
public static void main(String args[]) {
int m = 3; // 每天工作3小时
int b = 15; // 每小时15元
int a = 20; // 工作20天
int l = 4; // 请假4天
int c = 30; // 每天扣工资30元
int jiao = 5 * 20; // 20天的交通补助
int zong = m * b * a; // 上月的工资总数,每天工作3小时,20天,每小时15元
System.out.println("上月工资收入:" + zong + "块");
System.out.println("上月交通补助收入:" + jiao + "块");
// 计算扣除请假后的最终到手收入
int f = zong + jiao - l * c;
System.out.println("扣除请假后的最终到手收入是:" + f + "块");
}
}
执行后会输出:
上月工资收入:900块
上月交通补助收入:100块
扣除请假后的最终到手收入是:880块
【课后作业】
实战案例3-8-01:计算4名学生的年龄信息 用4个整型变量分别赋值表示4个学生的年龄,然后分别计算4名学生的总年龄和平均年龄。
实战案例3-8-02:计算本月的收入和支出 创建4个整型变量,然后分别实现变量之间的求和运算和百分比运算。
实战案例3-8-03:实现乘法和加法的混合运算 分别创建3个整型变量,然后实现乘法和加法的混合运算。
实战案例3-8-04:计算交通费 根据每天交通费的补助金额和补助天数,计算应发的交通费金额是多少。
注意: 在电脑运算中的运算它和数学运算符有些不同,一般来说分母不能为零,为零会发生程序错误,但是有时程序分母为零并不是错误,例如在下面的代码中出现了分母为零的情形。
将上述编译后会得到如图3-2所示的结果。
图3-2 运行结果
上面的结果提示用户的分母不能为零,如果将上述代码中的“int AAA=126”修改为“double AAA=126”,则编译执行后会得到图3-3所示的效果。这说明在基本运算符中,只要你将分子定义为double型,然后分母为零是正确的,而得到的值是无穷大,这一点希望初学者加以理解。
图3-3 更改后的执行效果
2.求余运算符
在Java程序中,求余运算的功能是使用第一个运算数除以第二个运算数,将得到的余数作为结果。例如,19 ÷ 3 = 6余1,这里的1就是一个余数。通过求余运算符可以得到这个余数。但是需要注意,使用求余运算符的两个运算数不但可以为正,而且还可以为负;不但可以是整型数,而且还可以是浮点数。在使用求余运算符时,计算结果的正负号取决于前面一个数是正数还是负数,不管后面数。例如下面演示了求余运算符的基本用法:
int K = -49 % -3; //-49 % -3的余数-1
int Q = 49 % -3; //49% - 3的余数1
int J = -49 %3 ; //-49% - 3的余数-1
范例3-9:货物搬运计算器(范例文件:daima\3\3-9\...\Yushu.java)
今天老板安排小菜去搬运货物,货物是100kg鸡翅,300kg土豆,200kg可乐,店里一辆小推车,每次可以拉80kg货物,小菜需要跑几趟,最后一次需要拉多少呢?
在本实例中定义了7个整型变量实现求余运算,分别用于表示不同货物的重量。代码如下:
public class Yushu {
public static void main(String[] args) {
int A = 100; // 变量A表示鸡翅
int K = 300; // 变量K表示土豆
int Q = 200; // 变量Q表示可乐
int J = 80; // 变量J表示小推车
int zong = A + K + Q; // 变量zong表示货物总量
// 计算需要跑几趟,记住后面加1才是正确的结果
int la1 = zong / J + 1;
// 计算余数,这个余数就是最后一次需要拉的货物质量
int la2 = zong % J;
System.out.println("搬运货物的总重量是:" + zong + "kg,");
System.out.println("小推车每次可以拉80kg货物,需要跑" + la1 + "趟运完所有货物,");
System.out.println("最后一次需要拉" + la2 + "kg,这个" + la2 + "就是余数。");
}
}
执行后会输出:
搬运货物的总重量是:600kg,
小推车每次可以拉80kg货物,需要跑8趟运完所有货物,
最后一次需要拉40kg,这个40就是余数。
注意:如果使用求余运算的两个运算数都是整数,则第二个运算数不能是0,否则将引发除以零异常。如果两个数中有1个或者2个是浮点数,则允许第二个操作数是0或0.0,只是求余运算的结果是非数:NaN。0或0.0对零以外的任何数求余都将得到0或0.0。
【课后作业】
实战案例3-9-01:比较除法运算和求余运算 创建多个整型变量,然后对这些变量分别实现除法运算和求余运算。
实战案例3-9-02:计算两个负数的求余运算 创建两个整型变量并分别赋值为负数,然后让两者实现求余运算。
实战案例3-9-03:余数的正负问题 创建4个变量,分别赋值为负数,然后进行求余运算操作。
实战案例3-9-04:判断输入的数字是奇数还是偶数 通过Scanner获取用户输入的数字,然后判断输入的这个数字是奇数还是偶数。
3.递增递减运算符
递增递减运算符分别是指“++”和“- -”,每执行一次,变量将会增加1或者减少1,它可以放在变量的前面,也可以放在变量的后面。比如,a = 5,“a++”后,a将变为6。
请看一个问题:在“a++”后a变为6,“++a”呢,怎么变化?“++a”后,a也会变为6。需要注意的是,两者在实际运用中差异很大。“a++”是自身先自加,然后再用自加后的值参与表达式运算和赋值;“++a”是先参加表达式运算和赋值,然后在进行自加。比如下面的代码中,a、x的初值都是5,执行后,b为6,y为5。
A = 5;b = a++; //先执行a++,得到a = 6,然后将s赋值给b,所以b = 6
X = 5;y = ++x; //先将x赋值给y,得到y = 5,然后执行x++,得到x = 6
注意:自增和自减运算符是算术运算符中的难点,他们的本质区别在于:自加或自减是在赋值及运算前,还是在赋值及运算后,核心是顺序问题。
范例3-10:统计本月顾客对员工的好评数据(范例文件:daima\3\3-10\...\Dione.java)
在本实例中定义了两个整型变量a和b,然后使用++和- -运算符实现递增和递减处理。代码如下:
public class Dione {
public static void main(String args[]) {
int a = 8000; // 定义整数类型变量a的初始值是8000
int b = 4000; // 定义整数类型变量b的初始值是4000
System.out.println("10:00本月小菜的顾客好评点赞数是:");
System.out.println(a++); // 先输出a的值(8000),然后a自增1
System.out.println("10:01本月小菜的顾客好评点赞数是:");
System.out.println(a); // 输出a的新值(8001)
System.out.println("10:02本月小菜的顾客好评点赞数是:");
System.out.println(++a); // a先自增1,然后输出a的新值(8002)
System.out.println("10:00本月同事A的顾客好评点赞数是:");
System.out.println(b--); // 先输出b的值(4000),然后b自减1
System.out.println("10:01本月同事A的顾客好评点赞数是:");
System.out.println(b); // 输出b的新值(3999)
System.out.println("10:02本月同事A的顾客好评点赞数是:");
System.out.println(--b); // b先自减1,然后输出b的新值(3998)
}
}
执行后会输出:
10:00本月小菜的顾客好评点赞数是:
8000
10:01本月小菜的顾客好评点赞数是:
8001
10:02本月小菜的顾客好评点赞数是:
8002
10:00本月同事A的顾客好评点赞数是:
4000
10:01本月同事A的顾客好评点赞数是:
3999
10:02本月同事A的顾客好评点赞数是:
3998
在上面程序中,“a++”是先执行程序才加1,“++a”是a先加1再执行程序,“a--”是先执行程序再减1,“---a”是a先减1然后再执行程序。代码“system.out.println(a++);”是先执行然后再加1,所以它输出的值应该是初始值4000,“system.out.println(a);”因为前一句代码将其加1,所以结果有所变化,结果为4001,“system.out.println(++a)”是先加1,其结果就是4002,而后面的代码也是类似的道理。
【课后作业】
实战案例3-10-01:前缀和后缀的区别 创建int类型变量a并赋值为1,然后分别对其进行前缀自增自减操作和后缀自增自减操作。
实战案例3-10-02:一家公司的面试题 创建一个整数类型变量a并赋值,然后分别计算“2 * ++a”和“2 * b++”的结果。
实战案例3-10-03:一道二级考试题 创建4个整数类型变量x、x1、y和y1并分别赋值,然后分别计算“x1 + x++”“++y - x”“x1 - --y””和“--y1 * y”的结果。
实战案例3-10-04:计算需要找给顾客的零钱是多少 根据现金金额和商品价格,计算给顾客的零钱金额。
3.5.2 关系运算符和逻辑运算符
问:在招聘会上,经常会看到对年龄的要求,例如要求年龄18岁以上,35岁以下,这句话怎么在计算机中用代码表示呢?假设年龄用变量age表示。
ChatGPT:可以用下面的数学式子来表示。在计算机的世界中,这个功能需要使用关系运算符和逻辑运算符实现。在Java程序设计中,关系运算符是指值与值之间的相互关系,逻辑(logical)运算符是指可以用真值和假值连接在一起的方法。
18<age<35
1.关系运算符
在数学运算中有大于或者小于、等于、不等于的关系,在程序中可以使用关系运算符来表示上述关系。变量A的值为10,变量B的值为20,则在表3-4中列出了使用Java关系运算符计算变量A和变量B的过程。通过这些关系运算符会产生一个结果,这个结果是一个布尔值,即true和false,在Java中任何类型的数据都可以用“==”进行比较是不是相等,用“!=”比较是否不相等,只有数字才能比较大小,关系运算的结果可以直接赋予布尔变量。
表3-4 关系运算符
运算符 | 描述 | 例子 |
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B)为真 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A > B)为假 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A < B)为真 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A > = B)为假 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真 |
2.逻辑运算符
布尔逻辑运算符是最常见的逻辑运算符,用于对Boolean型操作数进行布尔逻辑运算,在Java中的布尔逻辑运算符如表3-5所示。
表3-5 逻辑运算符
类型 | 说明 | 类型 | 说明 |
&& | 与(AND) | | | 简化或(Short-circuit OR) |
|| | 或(OR) | & | 简化并(Short-circuit AND |
∧ | 异或(XOR) | ! | 非(NOT) |
逻辑运算符与关系运算符的结果一样,都是Boolean类型的值。在Java程序设计中,“&&”和“||”布尔逻辑运算符不总是对运算符右边的表达式求值,如果使用逻辑与“&”和逻辑“|”,则表达式的结果可以由运算符左边的操作数单独决定。通过如表3-6所示的表,读者可以了解常用逻辑运算符号“&&”、“||”、“!”运算后的结果。
表3-6 逻辑运算符
A | B | A&&B | A||B | !A |
false | false | false | false | true |
false | true | false | true | true |
true | false | false | true | false |
true | true | true | true | false |
范例3-11:输出显示“某麦当劳餐厅的本月畅销商品” (范例文件:daima\3\3-11\...\Guanxi.java)
某麦当劳餐厅规定,某商品的月销量超过30000(包含30000)就是本店的热销商品。假设本月有如下3种商品的销量达到或超过30000:
- 薯条:销量60000。
- 麦乐鸡:销量40000。
- 圣代:30000。
在本实例中定义了3个整型变量a、b和c,分别用于表示3种商品的销量。代码如下:
public class Guanxi {
public static void main(String args[]) {
int a = 60000; // 赋值整数类型变量a的初始值是60000
int b = 40000; // 赋值整数类型变量b的初始值是40000
int c = 30000; // 赋值整数类型变量c的初始值是30000
System.out.println("市场调查:本月薯条的销量超过30000了吗?");
System.out.println(a >= 30000); // 输出true,因为 a 的值(60000)大于等于30000
System.out.println("市场调查:本月热销量商品包含麦乐鸡吗?");
System.out.println(b >= 30000); // 输出true,因为 b 的值(40000)大于等于30000
System.out.println("市场调查:本月的热销商品包含圣代吗?");
System.out.println(c >= 30000); // 输出true,因为 c 的值(30000)等于30000
System.out.println("薯条、麦乐鸡和含圣代都是本月的热销商品。");
}
}
执行后会输出:
市场调查:本月薯条的销量超过30000了吗?
true
市场调查:本月热销量商品包含麦乐鸡吗?
true
市场调查:本月的热销商品包含圣代吗?
true
薯条、麦乐鸡和含圣都是本月的热销商品。
【课后作业】
实战案例3-11-01:真心话大冒险 分别创建3个char类型变量和2个int类型变量,然后使用比较运算符比较这5个变量,模拟实现真心话大冒险游戏。
实战案例3-11-02:比较两个数的大小 创建两个int类型变量并分别赋值,然后使用6种比较运算符比较两个数字的大小。
实战案例3-11-03:复杂的逻辑运算 创建3个int类型变量d、k和j并分别赋值,然后分别打印输出“d < k || k < j”“d > k && k < j”和“!(d > k)”的结果。
3.5.3 位运算符
问:什么是位运算符?
ChatGPT:位运算符是用于直接操作二进制位的运算符,它们对整数的每一位进行操作。这些运算符通常在底层的位级别上执行操作,对于一些特定的编程需求,如位掩码、位移、和、或、异或等操作,位运算符提供了一种高效的解决方案。在Java语言中,使用位运算符操作二进制数据。位运算(Bitwise Operators)可以直接操作整数类型的位,这些整数类型包括long、int、short、char和byte。Java语言中位运算符的具体说明如表3-7所示。
表3-7 逻辑运算符
位逻辑运算符 | 说明 | 位逻辑运算符 | 说明 |
~ | 按位取反运算 | >> | 右移 |
& | 按位与运算 | >>> | 右移并用0填充 |
| | 按位或运算 | << | 左移 |
^ | 按位异或运算 |
表3-8中演示了操作数A和操作数B按位逻辑运算的结果。
表3-8 位逻辑运算结果
操作数A | 操作数B | A|B | A&B | A^B | ~A |
0 | 0 | 0 | 0 | 0 | 1 |
0 | 1 | 1 | 0 | 1 | 1 |
1 | 0 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 0 |
移位运算符把数字的位向右或向左移动,产生一个新的数字。Java的右移运算符有两个,分别是>>和>>>。
- >>运算符:能够把第一个操作数的二进制码右移指定位数后,左边空出来的位以原来的符号位来填充。即如果第一个操作数原来是正数,则左边补0。如果第一个操作数是负数,则左边补1。
- >>>:能够把第一个操作数的二进制码右移指定位数后,左边空出来的位总是以0来填充。
范例3-12:输出显示“某年度麦当劳的第四季度营收”(范例文件:daima\3\3-12\...\WeiOne.java)
在本实例中定义了两个整型变量a和b,然后对a和b实现位运算。代码如下:
public class WeiOne {
public static void main(String[] args) {
int a = 129; // 代码①,定义整型变量a并赋值为129
int b = 128; // 代码②,定义整型变量b并赋值为128
// 执行按位与操作,将a和b的二进制表示的每一位进行与操作
System.out.println("xx年麦当劳第四季度营收达" + (a & b) + "亿美元!"); // 代码③
}
}
- 代码①②分别定义两个int类型的变量a和b,并分别设置他们的初始值。
- 代码③使用println()函数打印输出“a & b”的运算结果。因为a的值是129,转换成二进制就是10000001,而b的值是128,转换成二进制就是10000000。根据与运算符的运算规则,只有两个位都是1时的运算结果才是1,所以“a & b”的运算过程是:
a 10000001
b 10000000
a&b 10000000
由此可以知道,a & b的运算结果是10000000,转换成十进制就是128,所以执行后会输出:
xx年麦当劳第四季度营收达128亿美元!
【课后作业】
实战案例3-12-01:计算2^3的结果 在println()中打印输出2^3的计算结果。
实战案例3-12-02:二进制转换器 创建两个整数类型变量并分别赋值,然后将这两个变量转换为二进制。
实战案例3-12-03:输出显示“某年度肯德基的第四季度营收”数据 创建两个整型变量a和b,然后对a和b实现位运算,将运算结果做为肯德基的第四季度营收数据。
实战案例3-12-04:计算~a的结果 创建整型变量a并赋值,然后计算~a的结果。
3.5.4 条件运算符
问:什么是条件运算符?
ChatGPT:条件运算符,也称为三元运算符,是一种用于简化条件语句的运算符。在大多数编程语言中,条件运算符的基本形式是 ? :,它有三个操作数,因此也被称为三元运算符。通常,它用于根据一个条件的真假选择两个值之一。在Java语言中,使用条件运算符的语法格式如下所示:
变量=(布尔表达式)?为true时所赋予的值:为false时所赋予的值;
请看下面的代码,具体含义是什么呢?
min =(a < b) ? a : b;
在上述代码中,其中“(a < b) ? a : b”是一个条件运算符表达式,它是这样执行的:如果a < b的结果为真,则表达式取a的值,否则取b的值。
范例3-13:用户满意度调查(范例文件:daima\3\3-13\...\Diao.java)
假设麦当劳规定的用户满意度合格成绩是90或90分以上,请尝试模拟实现用户满意度调查功能。
在本实例中定义了一个初始值为95的double类型变量gulinazha,模拟实现用户满意度调查,代码如下:
public class Diao {
public static void main(String args[]) {
double data = 95; // 赋值 data 的初始值为 95
// 使用条件运算符判断用户满意度,并生成相应的提示信息
String Tiao = (data >= 90) ? "用户对你很满意!" : "不是很优秀,你需要继续努力!";
// 输出结果
System.out.println(Tiao);
}
}
在上述代码中,设置如果变量data的值大于或等于90,则输出“用户对你很满意!”的提示,反之就输出“不是很优秀,你需要继续努力!”的提示。因为在代码中设置的“data = 95”,所以执行后会输出:
用户对你很满意!
【课后作业】
实战案例3-13-01:判断考试成绩是否及格 创建一个整数类型变量表示用户的考试成绩,然后使用三元运算符判断这个成绩是否及格。
实战案例3-13-02:判断考试成绩所述的分数档 使用Scanner获取用户输入的成绩,并将这个值赋值给变量x,然后打印输出“x >= 90 ? "A" : x >= 60 ? "B" : "C”的结果。
实战案例3-13-03:应聘者开出的工资要求 创建一个int类型变量a,然后对a进行条件运算,讲解过表示为工资要求。
实战案例3-13-04:判断你的颜值是否是高颜值 创建变量yanzhi并赋值,表示颜值,然后使用三目运算符判断颜值是否属于高颜值。
3.5.5 赋值运算符
问:什么是赋值运算符?
ChatGPT:赋值运算符用于将一个值赋给变量,Java语言中的赋值运算符是一个等号“=”。在Java中使用赋值运算符的格式如下所示。
var 变量 = eXPression;
在上述格式中,var必须是一种合法的数据类型,例如int、double等。var的类型必须与等号右边的表达式expression的类型一致。例如,在下面的代码中,使用了一个赋值语句对变量x、y、z都赋值为100。这是因为“=”运算符产生右边表达式的值,因此z = 100 的值是100,然后该值被赋给y,并依次被赋给x。使用“字符串赋值”是给一组变量赋与同一个值的简单办法。在赋值时类型必须匹配,否则将会出现编译错误。
int x,y,z; x = y = z = 100; //同时设置变量x,y和z 的值是100
在下表3-9中列出了Java语言支持的赋值运算符。
表3-9 赋值运算符
操作符 | 描述 | 例子 |
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C -A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A等价于C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
如果var声明的变量类型与表达式expression的类型不一致,当然会发生错误!例如,在下面的实例中,在计算总销售额时发生了赋值类型不匹配的错误。
范例3-14:一种错误的计算销售额的方式(范例文件:daima\3\3-14\...\Fuzhi.java)
假设月末来临,某个麦当劳餐厅计算销售额,每天平均销售额是100000元,每月30天,所以本月总销售额是3000000元。
在本实例中定义了3个byte型变量a、b和c,分别用于表示上面的3个数值。代码如下:
public class Fuzhi {
public static void main(String args[]){
byte a = 100000; //定义byte类型变量a的初始值是100000
byte b = 30; //定义byte类型变量b的初始值是30
byte c = a * b; //定义byte类型变量c的值是a和b的乘积
System.out.println(c);
}
}
在Java中,整数常量默认是int类型,而在这里,a 和 b 的值都是 int 类型,因此它们的乘积也是 int 类型。然而,将 int 类型的值直接赋给 byte 类型的变量 c,这会导致类型不匹配的错误,因为 int 类型的范围远大于 byte 类型。在上述代码中,因为100000和a*b都超出了byte类型的取值范围,所以执行后会出现类型不匹配的错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Type mismatch: cannot convert from int to byte
Type mismatch: cannot convert from int to byte
at Fuzhi.main(Fuzhi.java:6)
【课后作业】
实战案例3-14-01:一种错误的计算工资的方式 计算两个byte类型的变量的乘积表示工资金额,并查看计算结果是否合理。
实战案例3-14-02:求两个数最大公约数和最小公倍数 获取用户输入的两个正整数,然后计算这两个数最大公约数和最小公倍数。
实战案例3-14-03:体会+=的真正含义 创建一个整数类型变量a并赋值,然后打印输出“a += 4”的结果。
实战案例3-14-04:一道面试题 创建byte类型变量i并赋值为10,然后分别计算“i += 10”和“i += 128”的结果。
3.5.6 运算符的优先级
问:什么是运算符的优先级?
ChatGPT:运算符的优先级规定了在表达式中多个运算符同时存在时,哪些运算符会先进行计算。具有高优先级的运算符会先于低优先级的运算符执行。如果两个运算符有相同的优先级,那么它们的结合性决定了计算的方向(是从左到右还是从右到左)。
数学中的运算都是从左向右运算的,在Java中除了单目运算符、赋值运算符和三目运算符外,大部分运算符也是从左向右结合的,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是它们是从右向左运算的。乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作符可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序,在表3-10中列出了包括分隔符在内的所有运算符的优先级顺序,上一行中的运算符总是优先于下一行的。
表3-10 Java运算符的优先级
运算符 | Java运算符 |
分隔符 | .[] () {} , ; |
单目运算符 | ++ -- ~ ! |
强制类型转换运算符 | (type) |
乘法/除法/求余 | * / % |
加法/减法 | + - |
移位运算符 | <<>>>>> |
关系运算符 | < <= >= > instanceof |
等价运算符 | == != |
按位与 | & |
按位异或 | ^ |
按位或 | | |
条件与 | && |
条件或 | || |
三目运算符 | ?: |
赋值 | = += -= *= /= &= |= ^= %= <<= >>= >>>= |
所谓的优先级就是先计算谁的问题,例如加减乘除就是先计算乘除后计算加减,乘除的运算符优先级高于加减运算符的优先级。根据表3-10所示的运算符的优先级,假设“int a = 3”,开始分析下面变量b的计算过程。
int b = a + 2 * a
上述程序先执行2 * a得到6,再计算a + 6得到9。另外,我们可以使用小括号( )来改变程序的执行过程,例如:
int b = (a + 2) * a
上述代码则先执行a + 2得到5,再用5 * a得15。
再看下面的实例,演示了使用混合运算计算某麦当劳餐厅经理每月的收入的方法。
范例3-15:计算餐厅经理的本月收入(范例文件:daima\3\3-15\...\Income.java)
在本实例中定义了6个整型变量,在计算经理的本月收入时使用了混合运算。代码如下:
public class Income {
public static void main(String args[]) {
int a = 500; // 定义int类型变量a的初始值是500
int b = 20; // 定义int类型变量b的初始值是20
int h = 500; // 定义int类型变量h的初始值是500
int k = 450; // 定义int类型变量k的初始值是450
// 计算经理的本月收入,工资(a*b) + 饭补(h) + 交通补助(k)
int x = a * b + h + k; // 定义int类型变量x的值是a*b+h+k
// 计算经理的本月补助收入,饭补(h) + 交通补助(k)
int y = h + k; // 定义int类型变量y的值是h+k
// 打印输出结果
System.out.println("经理的本月收入(工资+饭补+交通补助)是:" + x);
System.out.println("经理的本月补助收入(饭补+交通补助)是:" + y);
// 判断变量x和y的值是否相等,并打印输出结果
System.out.println(x == y);
}
}
执行后会输出:
经理的本月收入(工资+饭补+交通补助)是:10095
经理的本月补助收入(饭补+交通补助)是:950
false
【课后作业】
实战案例3-15-01:实现基本的四则混合运算 创建两个整型变量m和n并分别赋值,然后打印输出“(m * 8 / (n + 2)) % m”的计算结果。
实战案例3-15-02:计算某程序员的收入 创建整型变量并分别赋值,用于表示片酬、饭补和交通补助,然后分别计算“基本工资+饭补+交通补助”和“饭补+交通补助”的结果。
实战案例3-15-03:破解一道二级考试题 创建3个整型变量aa、bb、hh和kk并分别赋值,然后分别计算“aa – bb + kk”和“bb * kk / bb + hh”的结果。
实战案例3-15-04:计算10个整数中的最大值和最小值 接受用户输入的10个数字,然后输出这10个整数的最大值和最小值。
注意:书写Java运算符的两点注意事项:
- 不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成。
- 不要过多地依赖运算符的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用小括号( )来控制表达式的执行顺序。