系列文章目录
前言
本文介绍Java运算符的相关知识。
一、运算符是什么?
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
常用的运算符有:
- 算数运算符
- 赋值运算符
- 关系运算符 [比较运算符]
- 逻辑运算符
- 位运算符 [需要二进制基础]
- 三元运算符
二、运算符
1.算数运算符
算数运算符是对数值类型的变量进行运算的,在 Java 程序中使用的非常多。
示例
//1.除号的使用细节 ”/“
System.out.println(10 / 4); // 从数学上来看是2.5,在 Java 中输出位为2
System.out.println(10.0 / 4); // 在 Java 中输出位为2.5,选择范围更高的
double d = 10 / 4; // 在 Java 中输出位为2.0
//2. 取模(取余)”%“ 的本质是一个公式 a % b = a - a / b * b !!!!
System.out.println(10 / 3); // 1
System.out.println(-10 / 3); // -1
System.out.println(10 / -3); // 1
//3. ++的使用
int i = 10;
i++; // 自增 等价于 i = i + 1 // 11
++i;// 自增 等价于 i = i + 1 // 12
//如果作为独立语句使用两者是完全一样的
System.out.println("i=" + i); // 12
/*
作为表达式使用
前++ : ++i 先自增后赋值
后++ : i++ 先赋值后自增
*/
int j = 8;
int k = ++j; // 等价于 j = j + 1; k = j;
System.out.println("k=" + k + "j=" + j); //9,9
int j = 8;
int k = j++; // 等价于 k = j; j = j + 1;
System.out.println("k=" + k + "j=" + j); //8,9
练习
int i = 1;
i = i++;
System.out.println(i);
输出结果为 1。第二句的细节是:(1)temp = i;(2)i = i + 1;(3)i = temp;
int i = 1;
i = ++i;
System.out.println(i);
输出结果为 2。第二句的细节是:(1)i = i + 1;(2)temp = i;(3)i = temp;
2.关系运算符(比较运算符)
关系运算符的结果都是 boolean 型,也就是要么是 true, 要么是 false。关系表达式经常用在 if 结果的条件语句中或循环结构的条件中。
3.逻辑运算符
逻辑运算符:用于连接多个条件(多个关系表达式),最终的结果也是一个 boolean 值。
- 短路与 &&,短路或 ||,取反 !
- 逻辑与 &,逻辑或 |,逻辑异或 ^
- && 短路与和 & 逻辑与的基本规则是一样的,两个条件都为 true,结果为 true,否则 false。两者的区别在于:&& 短路与,如果第一个条件为 false, 则第二个条件不会判断,最终结果为 false,效率高;&逻辑与,不管第一个条件是否为 false,第二个条件都要判断,效率低;开发中,我们使用的基本是短路与&&。
- || 短路或和 | 逻辑或的基本规则是一样的,两个条件只要有一个 true,那么结果就为 true,否则 false。两者的区别在于:|| 短路或,如果第一个条件为 true, 则第二个条件不会判断,最终结果为 true,效率高; | 逻辑,不管第一个条件是否为 true,第二个条件都要判断,效率低;开发中,我们使用的基本是短路与 || 短路或。
4.赋值运算符
赋值运算符:赋值运算符就是将某个运算后的值,赋给指定的变量。运算顺序从右到左。
- 基本赋值运算符 =
- 复合赋值运算符 +=、-=、*=、/=、%=等。a += b 等价于 a = a + b
//复合赋值运算符会进行类型的转换
byte b = 3;
b += 2; //等价于 b = (byte)(b + 2);,直接 b = b + 2; 报错
b++; //等价于 b = (byte)(b + 1); 底层也有自动转换
5.三元运算符
基本语法:
条件表达式 ?表达式1:表达式2;
运算规则:
如果条件表达式为 true,运算后的结果是表达式1;
如果条件表达式为 false,运算后的结果是表达式2;
6.位运算符
java 中有 7 个位运算(按位与 &、按位或 |、按位异或 ^、按位取反 ~、按位取反 ~、>>、<< 和 >>>)
计算机运行时,都是以补码的方式
- 按位与 &:两位全为1,结果为1,否则为0
- 按位或 |:两位有一个为1,结果为1,否则为0
- 按位异或 ^:两位一个为0,一个为1,结果为1,否则为0
- 按位取反 ~:0变成1,1变成0
- 算术右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位
- 算术左移 <<:符号位不变,低位补0
- 逻辑右移也叫无符号右移 “>>>” :低位溢出,高位补0
System.out.println(2&3); //推导过程:1.先得到2和3的补码;2.按位&运算 3. 得到答案的补码,转换成原码
System.out.println(~-2); //先得到-2的补码,然后进行取反,转换成原码
三、运算符优先级
- 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下表,上一行运算符总优先于下一行。
- 只有单目运算符、赋值运算符是从右向左运算。
- (),{}等 > 单目运算符 > 算术运算符 > 位移运算符 > 比较运算符 > 逻辑运算符 > 逻辑运算符 > 三元运算符 > 赋值运算符