Java基础06——运算符
Java中的运算符
-
概念:运算符就是告诉程序执行特定的运算操作的符号。
-
Java中提供了六类运算符,分别是 赋值运算符、算术运算符、关系运算符、逻辑运算符、位运算符 和 条件运算符。
-
学习目标:实现模拟幸运抽奖,关键步骤如下:
- 获取键盘输入的会员卡号。
- 将会员卡号存储在变量中。
- 使用运算符分解会员卡号,获得各位上的数字。
- 将分解后的数字相加,判断是否中奖。
一、赋值运算符
-
赋值运算符
=
用于给变量指定变量值,并可以和算术运算符结合组成复合赋值运算。 -
复合赋值运算符主要包括:
+=
、-=
、*=
、/=
、%=
。 -
示例:
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; -
注意:
- 除法运算符,如果两个操作数均是整数,结果也为整数,会舍弃小数部分;如果两个操作数中有一个是浮点数,将进行自动类型转换,结果也是浮点数,保留小数部分。
- 对于取模运算符,如果两个操作处均是整数,结果也是整数;如果两个操作数中有一个是浮点数,结果也是浮点数,保留小数部分。
- 自增运算符,只有
i++
、++i
两种使用方式,他们的相同点是都相当于i = i + 1;
,不同点是i++
是先进行表达式运算再加一,而++i
是先加一再进行表达式运算。
-
示例:使用
/
和%
运算符获取会员卡各位上的数字,得到分解后的数字之和。实现步骤:
- 4位会员卡号和10求余可得个位数。
- 4位会员卡号除以10再和10求余可得十位数。
- 4位会员卡号除以100再和10求余可得百位数。
- 4位会员卡号除以1000可得千位数。
- 计算各位之和。
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
三、关系运算符
-
关系运算符有时又称比较运算符,用于比较两个变量或常量的大小。
-
运算结果是布尔值,
true
或false
。 -
Java中共有六个关系运算符,分别为:
==
、!=
、>
、<
、>=
、<=
。如下所示:运算符 含义 范例 结果 == 等于 5==6 false != 不等于 5!=6 true > 大于 5>6 false < 小于 5<6 true >= 大于等于 5>=6 false <= 小于等于 5<=6 true -
注意:
=
为赋值运算符,==
为等于运算符。>
、<
、>=
、<=
只支持数值类型的比较。==
、!=
支持所有数据类型的比较,包括数值类型、布尔类型、引用类型。- 关系表达式的结果为布尔值。
>
、<
、>=
、<=
优先级别高于==
、!=
。
-
示例:根据会员卡各位上的数字之和判断用户是否中奖。
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 && 短路与 运算规则同”&“,但短路 || 短路或 运算规则同”|“,但短路 -
注意:
- 操作数类型只能是布尔类型,操作结果也是布尔值。
- 优先级别:
!
>&
>^
>|
>&&
>||
。 &
和&&
的区别,当&&
的左侧为false时,则将不会进行其右侧的表达式,即左false则false;无论任何情况,&
两侧的表达式都会参与计算。|
和||
的区别与&
和&&
的区别类似。
五、位运算符
-
位运算符及运算规则如下所示:
运算符 含义 运算规则 & 按位与 两个操作数都是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,前提是溢出位数不包含有效数字
a=a*4
,a=a<<2
的作用和结果是相同的,但是使用位运算符具有更快的速度。- 位运算符对操作数以二进制为单位进行运算。
- 位运算的操操作数是整型数,包括:int、short、long、byte、char。
- 位运算的结果也是整型数,包括:int、long。
- 如果操作数是 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 =、+=、-=、*=、/=、%=、&=、|=、^=、~=、<<=、>>=、>>>= 从右向左 -
提示:
- 优先级别最低的赋值运算符,其次是条件运算符。
- 单目运算符包括
!
、~
、++
、--
,优先级别高。 - 可以通过
()
控制表达式的运算顺序,()
优先级别最高。 - 总体而言,优先顺序为:算术运算符>关系运算符>逻辑运算符。
- 结合性为从右向左的只有赋值运算符、三目运算符和单目运算符(一个操作数)。