运算符的分类
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
- 算术运算符
- 赋值运算符
- 关系运算符 [比较运算符]
- 逻辑运算符
- 位运算符
- 三元运算符
1. 算术运算符
介绍
算术运算符是对数值类型的变量进行运算的,在Java程序中使用的非常多。
算术运算符一览
案例演示
- 案例演示算术运算符的使用(ArithmeticOpertator.java)。
+, - , * , / , %, ++, – , 重点 /、%、++ - 自增:++
作为独立的语句使用:
前++和后++都完全等价于 i=i+1;
作为表达式使用
前++:++i先自增后赋值
后++:i++先赋值后自增 - – ,+、-、* 是一个道理,完全可以类推。
- 代码演示
public class ArithmeticOperator {
public static void main(String[] args) {
// 除法
// 当两个整数相除, 保留的整数, 去掉小数部分
// 注意: 不会进行四舍五入.
System.out.println(10 / 4); //2
// 如果有一个运算的数是double ,则结果是double
System.out.println(10.0 / 4); //2.5
// 解读
//1. 10 / 4 ==> 2
//2. 将 2 赋给了 double ,进行自动数据类型转换 2.0
double d1 = 10 / 4; // ? 结果是什么?
System.out.println("d1=" + d1);// 2.0
//取模, 就是取对应余数
//给大家一个公式, 取模的公式
// a % b = a - a / b * b [记住]
// -10 % 3 = -10 - (-10) / 3 * 3 = -10 + 9 = -1
// -10 % -3 = -10 - (-10) / (-3) * -3 = -10 + 9 = -1
// 10 % -3 = 10 - 10 / -3 * -3 = 10 - 9 = 1
System.out.println("10 % 3=" + (10 % 3) ); // 1
System.out.println("-10 % 3=" + (-10 % 3) ); // -1
System.out.println("-10 % -3=" + (-10 % -3) ); // -1
System.out.println("10 % -3=" + (10 % -3) ); // 1
//++ 使用
//解读
//1. ++ 表示自增
//作为独立的语句使用, a++ 和 ++a 是一样
int a = 7;
a++; // ==>等价 a = a + 1; // 8
++a; // ==> 等价 a = a + 1; // 9
System.out.println("a=" + a); //9
//作为表达式使用
// 前++:++i先自增后赋值
// 后++:i++先赋值后自增
int i = 10;
int j = ++i; //等价 1. 先自增 i = i + 1; 2. j = i; //再赋值
System.out.println("j=" + j) ; // 11
int k = 8;
int m = k++; // 等价 1. 先赋值 m = k; 2. 再自增 k = k+ 1;
System.out.println("k=" + k); // k = 9
System.out.println("m=" + m); //m = 8
int num1 = 20; //
num1--; // 独立使用 num1 = num1 - 1 => num1 = 19
--num1; // 独立使用 num1 = num1 - 1 => num1 = 18 [这里num1 就是 18]
int num2 = ++num1; // (1) num1 = num1 + 1 [num1= 19] (2) num2 = 19
int num3 = num1--; //(1) num3 = 19 (2) num1 = num1 - 1 [num1=18]
System.out.println("num1=" + num1); //18
System.out.println("num2=" + num2); // 19
System.out.println("num3=" + num3);// 19
}
}
细节说明
1. 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 例如:int x= 10/3 ,结果是 3
2. 当对一个数取模时,可以等价 a%b=a-a/b*b , 这样我们可以看到 取模的一个本质运算。
3. 当 自增 当做一个独立语言使用时,不管是 ++i; 还是 i++; 都是一样的,等价
4. 当 自增 当做一个 表达式使用时 j = ++i 等价 [ i = i+1; j = i;]
5. 当 自增 当做一个 表达式使用时 j = i++ 等价 [j = i; i = i+1]
6. – 的使用的原理是和 ++
面试题
- 面试题1
1. int i=1; // i=1;
i=i++; // 等价 (1) int temp = i; (2) i = i + 1 (3) i = temp;
System.out.println(i); //1, 原因就是上面的分析过程
问:结果是多少?为什么?
- 面试题2
1. int i=1;
i=++i; // 等价 (1) i = i + 1; (2) int temp = i (3) i = temp;
System.out.println(i); // 2
2. 关系运算符(比较运算符)
介绍
- 关系运算符的结果都是boolean型,也就是要么是true,要么是false
- 关系表达式 经常用在 if结构的条件中或循环结构的条件中
关系运算符一览表
案例演示
案例演示关系运算符的使用(RelationalOperator.java)。
int a = 9; //开发中,不可以使用 a, b a1,bc n1 , n2...
int b = 8;
System.out.println(a>b); //t
System.out.println(a>=b); //T
System.out.println(a<=b); // F
System.out.println(a<b); // F
System.out.println(a==b); //F (false)
System.out.println(a!=b);//T
boolean flag = a>b; // flag = true;
细节说明
- 关系运算符的结果都是boolean型,也就是要么是true,要么是false。
- 关系运算符组成的表达式,我们称为关系表达式。 a > b
- 比较运算符“==”不能误写成“=”
3. 逻辑运算符
介绍
用于连接多个条件(多个关系表达式),最终的结果也是一个boolean值。
逻辑运算符一览
说明逻辑运算规则:
1. a&b : & 叫逻辑与:规则:当a 和 b 同时为true ,则结果为true, 否则为false
2. a&&b : & 叫短路与:规则:当a 和 b 同时为true ,则结果为true,否则为false
3. a|b : | 叫逻辑或,规则:当a 和 b ,有一个为true ,则结果为true,否则为false
4. a||b : | 叫短路或,规则:当a 和 b ,有一个为true ,则结果为true,否则为false
5. !a : 叫取反,或者非运算。当a 为true, 则结果为false, 当 a 为false是,结果为true
6. a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为true, 否则为false
&& 和 & 案例演示
案例演示&& 和 & 运算符的使用(LogicOper.java)。
public class LogicOper {
public static void main(String[] args) {
//演示 && 和 & 的用法
double score = 70;
if(score > 60 && score < 90) { // T
System.out.println("ok1");
}
if(score > 60 & score < 90) { // T
System.out.println("ok2");
}
//区别来了...
int a = 5;
int b = 80;
//(1)&&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false,效率高
//(2) & 逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低
if(a < 3 && b++ > 30) { // 这里 b++ > 30 不会执行
System.out.println("hello");
}
System.out.println("a=" + a + " b= " +b); // a = 5 b = 80
System.out.println();
if(a < 3 & b++ > 30) { // 这里 b++ > 30 会执行
System.out.println("hello");
}
System.out.println("a=" + a + " b= " +b); // a = 5 b = 81
}
}
&& 和 & 使用区别
- &&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false,效率高
- & 逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低
- 开发中, 我们使用的基本是短路与&&, 效率高
|| 和 | 案例演示
案例演示&& || !运算符的使用(LogicOper.java)。
public class LogicOper2 {
public static void main(String[] args) {
//1. ||短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true,效率高
//2. | 逻辑或:不管第一个条件是否为true,第二个条件都要判断,效率低
//3. 开发中,我们基本使用 ||
int a = 10;
int b = 20;
if(a > 5 || --b > 9) { // || 是短路或, 因此 不会执行 --b > 9
System.out.println("ok1");
}
System.out.println("a=" + a + " b=" + b); // a = 10 b = 20
if(a > 5 | --b > 9) { // | 是逻辑或, 因此 会执行 --b > 9
System.out.println("ok2");
}
System.out.println("a=" + a + " b=" + b); // a = 10 b = 19
boolean isPass = !(a > b); // true
System.out.println("isPass=" + isPass);
//^逻辑异或
//a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为true, 否则为false
//解读
//1. 4 < 1 => F
//2. 6 > 3 => T
//3. (4 < 1) ^ (6 > 3) => T
System.out.println( (4 < 1) ^ (6 < 3) );
}
}
|| 和 | 使用区别
- ||短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true,效率高
- | 逻辑或:不管第一个条件是否为true,第二个条件都要判断,效率低
- 开发中,我们基本使用 ||
! 取反 基本规则
名称 | 语法 | 特点 |
! 非(取反) | !条件 | 如果条件本身成立,结果为false,否则为true |
案例演示
^逻辑异或,System.out.println( (4 < 1) ^ (6 > 3) );
4. 赋值运算符
介绍
赋值运算符就是将某个运算后的值,赋给指定的变量。
赋值运算符的分类
• 基本赋值运算符
=• 复合赋值运算符
+= ,-= ,*= , /= ,%= 等 , 重点讲解一个 += ,其它的使用是一个道理
a += b; [等价 a = a + b]
a -= b; [等价 a = a - b]
赋值运算符特点
- 运算顺序从右往左 int num = a + b + c
- 赋值运算符的左边 只能是变量,右边 可以是变量、表达式、常量值
int num = 20; int num2= 78 * 34 - 10; - 复合赋值运算符等价于下面的效果
- 比如:a+=3;等价于a=a+3;
- 复合赋值运算符会进行类型转换。
byte b = 2; b+=3; b++; 等 b += 3 等价 b = (byte)(b+3); - 代码演示
public class AssignOper {
public static void main(String[] args) {
//有两个变量,a和b,要求将其进行交换,最终打印结果
int a =90;
int b = 100;
//思路:定义一个临时变量 temp, 做中转
int temp = a;
a = b; // 把 b 赋给 a
b = temp ; // 把temp 赋给 b
System.out.println("a=" + a + " b=" + b);
//有两个变量,a和b,要求将其进行交换, 但是不可以使用中间变量 temp
//???
}
}
5. 三元运算符
基本语法
- 条件表达式 ? 表达式1: 表达式2;
- 如果条件表达式为true,运算后的结果是表达式1;
- 如果条件表达式为false,运算后的结果是表达式2;
- 口诀: [一灯大师 => 一真大师]
案例演示
public class MultlOper {
public static void main(String[] args) {
int a = 10;
int b = 5;
//分析
//1. a > b 为 真
//2. res = 800
int res = a > b ? 800 : 900;
System.out.println("res=" + res);
//表达式1和表达式2要为可以赋给接收变量的类型(或可以自动转换)
//下面这个语句是错误, 因为满足上面要求
//short res2 = a > b ? 800 : 900;
//解决方法
//1. short res2 = a > b ? (short)800 : (short)900;
//2. long(int) res2 = a > b ? 800 : 900;
//表达式1 和 表达式2 可以很复杂
int res3 = a > b ? 8 * 45 - 78 : 90 / 3 + 4 - 9 + Math.abs(-1) ;
}
}
使用细节
- 表达式1和表达式2要为可以赋给接收变量的类型(或可以自动转换)
- 三元运算符可以转成if–else 语句
int res = a > b ? a++ : --b;
举例 改成, 这里体验一下:
int res = 0;
if( a > b ) {
res = a++;
} else {
res = --b;
}
6. 运算符优先级
- 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如右表,上一行运算符总优先于下一行。
- 只有单目运算符、赋值运算符是从右向左运算的。
小结:
- () 和 . 优先级最高
- 单目运算, 比如 ++, –
- 算术运算符(* , / , % +, - 等)
- 位移运算符
- 比较运算符
- 逻辑运算符
- 三元运算符
- 赋值运算符
图: