分类:
算术运算符
赋值运算符
比较运算符
逻辑运算符
位运算符
三目运算符
目录
算术运算符:
明确: 二元运算符: 需要两个操作数才能完成运算的运算符 例如: 5 * 3
-- 二元算术运算符: + , - , * , / , %
加法运算符: +
第一种使用: 正号 了解
例如: +9 , 9 +号可以省略不写
第二种使用: 做加法运算 10 + 5
说明: 左右两边操作数是:整数,小数,char类型
例如: 10 + 5.5
'a' + 1
第三种使用: 做字符串连接符
说明: 左右两边操作数至少有一个是字符串
例如: "hello" + "world" --> "helloworld"
"张三" + 100 + "年" --> "张三100年"
"李四" + 1 + 99 + "年" --> "李四199年"
"王五" + (1 + 99) + "年" --> "王五100年"
运算顺序: 有()先算() , 没有() 从左往右一顺拼接
减法运算:-
第一种使用: 负号 不能省略
例如: -9
第二种使用: 减号
说明: 左右两边操作数是:整数,小数,char类型
例如: 100 - '1' - 5.5
总结: 任意一个算术表达式,例如:100 - '1' - 5.5 的结果类型是表达式的最大类型
乘法运算:*
说明: 左右两边操作数是:整数,小数,char类型
例如: 10 * '菜'
除法运算:/
说明: 左右两边操作数是:整数,小数,char类型
例如: 10 / 3 ---> 3
例如: 10 / 0 ---> 数学异常:ArithmeticException
结论: 整数和整数做除法只能得到整数
分母不能为:0 ,否则就会出现数学异常
取余运算符: %
说明: 左右两边操作数是:整数,小数,char类型
例如: 10 % 3 ----> 1
例如: 10 % 3.0 ----> 1.0
推导:
1 % 3 = 1
2 % 3 = 2
3 % 3 = 0
4 % 3 = 1
...
m % n = [0,n-1] : m> 0 , n > 0 -- 任意一个整数m 对另外一个整数n 取余,余数的范围:[0,n-1]
【随堂练习】
1、判断一个数是奇数还是偶数;
分析:
1. 定义一个整数变量:num
int num = 19;
2. 使用if...else 双选结构判断num是奇数还是偶数
判断条件:
num % 2 == 1 : num 是奇数 常用
num % 2 != 0 : num 是奇数
num % 2 == 0 : num 是偶数 常用
num % 2 != 1 : num 是偶数
3.根据判断情况,打印结果
说明:java中 , = 是赋值号, == 判断是否相等
补充: 判断一般使用分支结构:if
两种情况讨论:if...else
if(判断条件){
当 判断条件 成立,执行的代码
}
else{
当 判断条件 不成立,执行的代码
}
2、获取整数987的百位数、十位数和个位数。
分析:
1. 定义一个整数变量num,值为:987
int num = 987;
2. 获取num的个位,十位,百位上的数
int bit1 = num % 10;
int bit2 = num / 10 % 10; 常用
int bit2 = num % 100 / 10 ;
int bit3 = num / 100 % 10 ;
3.打印输出结果
-- 一元算术运算符:++ , -- 例如: ++num
说明:1. ++ , --只能针对变量,不能应用于常量
以++为例:
单独使用: 95% 在循环结构中使用
++在变量的前面和后面没有区别,都是等价于:num = num + 1;
参与其他运算:5%
++num : 先让num自增加1 ,然后num自增之后的值参与其他运算
num++ : 先拿到num自增加1之前的值参与其他运算,算完之后再让num自增加1
【思考】
1、可以对常量进行递增或递减操作吗?例如:5++或++5。
不行, 因为常量值不能改变,而++是为了自增改变值
2、int num = 5; num = num++;请问代码执行后num的值为多少?
赋值运算符
分类:
普通的赋值运算符: =
特殊的赋值运算符: += , -= , *= , /= , %=
明确: 1. 特殊的赋值运算符是二元算术运算符和 普通的赋值运算符 的结合体
2. += 之间不能有空格
a += b;
说明: b 可以是常量 ,可以是表达式,也可以是变量
a += b; 等效于: a = (a的类型)(a + (b));
a -= b; 等效于: a = (a的类型)(a - (b));
a *= b; 等效于: a = (a的类型)(a * (b));
a /= b; 等效于: a = (a的类型)(a / (b));
a %= b; 等效于: a = (a的类型)(a % (b));
结论:特殊的赋值运算符隐含了强制类型转换
使用中一般采用:sum = sum + 10; -- 不建议用:sum += 10;
1、交换两个变量的值(用三种方式实现)。
int a = 3 , b = 5;
交换之后: a = 5 , b = 3
方式一: 使用临时变量temp 推荐
优点: 思路简单 缺点:浪费内存
方式二: 使用一加两减
优点:节约内存 缺点: 思路复杂
方式三:采用异或位运算 位运算讲解
1、short num = 11; num = num + 1; 和short num = 11; num += 1;哪一个正确呢?
第二个正确: num += 1;等效于: num = (short)(num + 1);
2、int sum += 30; 请问这行语句语法是否正确???
int sum = sum + 30;
比较运算符
分类: > , < , >= , <= , == , !=
明确: 1. 比较运算符是 二元运算符
2. 比较运算符的运算结果是boolean类型
== : 等于符号
说明: 如果比较的是基本数据类型, == 比较的是数据值是否相等
如果比较的是引用数据类型, == 比较的是内存地址值是否相同
!=: 不等于
例如: a != b;
当 a != b 成立时 ,结果为:true
当 a != b 不成立时 ,结果为:false
逻辑运算符
分类: & , | , ^ , ! , && , ||
明确: 逻辑运算符两边的操作数是boolean类型,最终的结果也是boolean类型
逻辑与:&
执行的特点: 有false则false
辅助记忆: 有房? 并且 有车?
逻辑与:|
执行的特点: 有true则true
辅助记忆: 有房? 或者 有车?
逻辑异或:^
执行的特点: 相同为false ,不同为true
辅助记忆: 同级相斥,异级相吸
逻辑非 : ! 一元运算符
执行特点: 取反 , 非true为false , 非false为true
注意事项: 逻辑非一般只用一个。
短路与: &&
运行特点: & 和 && 都是有false则false,但是&& 具有短路效果
短路效果 : 效率比&高
当左边结果为:false时, 右边不执行,直接将左边false作为最终的结果
当左边结果为:true时, 右边执行,将右边执行的结果作为最终的结果
短路或: ||
运行特点: | 和 || 都是有true则true,但是|| 具有短路效果
短路效果:当左边结果为:true时, 右边不执行,直接将左边true作为最终的结果
当左边结果为:false时, 右边执行,将右边执行的结果作为最终的结果
补充: 4(包含)~6(不包含) : [4 , 6) 之间所有的整数
补充: 4(包含)~6.0(不包含) : [4 , 6.0) 之间所有的整数和小数
练习:
1、判断一个数是否在4(包含)~6(不包含)之间;
分析:
1. 定义一个int类型的整数变量,变量名:num
int num = 5;
2. 判断num是否在[4,6)之间
条件一:num >= 4
条件二:num < 6
数学中: 4 <= num < 6
java中: 4 <= num && num < 6
2、判断一个数是否在4(不包含)~6(包含)之外;
3、判断一个数是否在4(不包含)~6.0(包含)之外;
位运算符
逻辑运算符: & | ^ !
分类: & , | , ^ , ~ , << , >> , >>>
明确: 位运算符直接操作二进制,运算效率比普通的运算符高
与位运算: & 二元运算符, 左右两边的操作数可以是整数
运行特点: 有0则0
或位运算: | 二元运算符, 左右两边的操作数可以是整数
运行特点: 有1则1
异或位运算: ^ 二元运算符, 左右两边的操作数可以是整数
运行特点: 相同为0 , 不同为1\
结论: 任意两个正整数:m , n, 当m连续异或两次n值还是:m
m ^ n ^ n = m
n ^ m ^ n = m
使用场景:异或位运算符以后可以做数据加密
123 ^ n --> 程序员 ---> 123 ^ n ^ n
exct ^ 3 --> 程序员 ---> exct ^ 3 ^ 3
练习: 交换两个整数变量的位置:int a = 3 , b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
非位运算: ~ 一元运算符, 右边的操作数可以是整数
运行特点: 取反: 非0为1,非1为0
左移位运算: << 二元运算符, 左右边的操作数可以是整数
特点: 直接将二进制值向左边移动,然后最低为补0
结论:m和n都是正整数, m << n 等效于:m * 2 ^ n
右移位运算: >> 二元运算符, 左右边的操作数可以是整数
正整数右移:最高位补0
负整数右移:最高位补1
结论: m和n都是整数, m >> n 等效于:m / (2 ^ n)
无符号右移: >>> 二元运算符, 左右边的操作数可以是整数
>>> 和 >> 区别:
负整数 无符号右移 最高位补0
负整数 右移 最高位补1
题: 请写出 5 * 2 的最高效表示? 5 << 1
三目运算符
明确: 三目运算符 需要三个操作数才能完成运算给,又称为三元运算符
格式: 关系表达式? 结果1 : 结果2 ;
例如: num % 2 == 0 ? "偶数":"奇数";
执行流程: 先计算关系表达式的结果
当 关系表达式 结果为:true时, 将结果1 赋值给 左边的变量
当 关系表达式 结果为:false时, 将结果2 赋值给 左边的变量
练习:
1、获取两个数的最大值或最小值
分析:
1. 定义两个int类型整数, num1 和num2
int num1 = 10 , num2 = 20;
2. 使用三目运算符求出 num1 和num2 中的最大值
int max = ( num1 > num2 ? num1 : num2);
3. 输出结果
2. 获取三个数的最小值
1. 定义三个int类型的整数:a, b , c
int a = 7 , b = 8 , c = 1;
2. 使用三目运算符求出a和b中的较小值,使用临时变量temp接收
int temp = a > b ? b : a;
3. 使用三目运算符求出temp和c中的较小值 ,使用最下值变量min 接收
int min = temp > c ? c : temp;
4. 输出打印min即为最小值
注意事项: 1. 结果1 和 结果2的数据类型要保持一致
2. 运算符的运算符优先级:
= : 先算右边,再把右边的结果赋值给左边
&& : 从左往右一顺算
关系表达式? 结果1 : 结果2 ; 先判断关系表达式,得到结果再赋值给左边的变量