运算符
概述
运算符用于对变量或字面量进行运算,与操作数一起组成表达式,得到结果或产生副作用。Java 中的运算符按功能分为:算术、关系、逻辑、位、赋值、条件(三元)等。掌握运算符的语义与优先级,是正确书写条件判断和数学运算的基础。
本文介绍各类运算符的用法、运算中的类型提升,以及整数除法、短路求值等常见注意点。
前置建议
已掌握 变量与数据类型,了解 int、double、boolean 等类型及字面量写法。
算术运算符
用于数值的加减乘除与取余,以及自增、自减。
基本算术:+ - * / %
| 运算符 | 含义 | 示例 |
|---|---|---|
+ | 加法 | a + b |
- | 减法 | a - b |
* | 乘法 | a * b |
/ | 除法 | a / b |
% | 取余数 | a % b |
int a = 10, b = 3;
System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3:整数除法,商为整数
System.out.println(a % b); // 1:余数注意
两个整数相除 / 得到的是整数商,小数部分被截断。若要得到小数结果,至少有一个操作数为浮点类型(或先强转)。
int x = 10, y = 4;
double z = x / y; // 先按 int 运算得 2,再赋给 double,z = 2.0
double w = (double) x / y; // 2.5:将 x 转为 double 后运算自增与自减:++ --
++ 使变量加 1,-- 使变量减 1。可写在变量前(前缀)或后(后缀),区别在于表达式的值:
- 前缀
++a:先自增,再取新值作为表达式结果。 - 后缀
a++:先取当前值作为表达式结果,再自增。
int n = 5;
System.out.println(++n); // 先变为 6,输出 6
System.out.println(n); // 6
int m = 5;
System.out.println(m++); // 先输出 5,再变为 6
System.out.println(m); // 6提示
日常书写时,若只需「加 1」或「减 1」而不使用表达式值,前缀与后缀效果相同,推荐单独一行使用,避免在复杂表达式中混用 i++ 与 ++i 降低可读性。
关系运算符(比较)
用于比较两个值,结果为 boolean(true 或 false)。常用于 流程控制 中的条件判断。
| 运算符 | 含义 | 示例 |
|---|---|---|
== | 相等 | a == b |
!= | 不相等 | a != b |
> | 大于 | a > b |
< | 小于 | a < b |
>= | 大于等于 | a >= b |
<= | 小于等于 | a <= b |
int age = 18;
boolean isAdult = age >= 18; // true
double score = 89.5;
System.out.println(score >= 60); // true
System.out.println(10 == 10); // true
System.out.println(10 != 20); // true注意
== 比较的是值:基本类型比较数值是否相等;引用类型比较的是是否指向同一对象,不比较内容。比较两个字符串内容是否相等应使用 equals(),详见 String 与字符串操作。
逻辑运算符
用于组合或取反布尔条件,操作数与结果均为 boolean。
| 运算符 | 含义 | 说明 |
|---|---|---|
! | 逻辑非 | 取反,!true 为 false |
&& | 逻辑与 | 两边都为 true 才为 true |
|| | 逻辑或 | 任一边为 true 即为 true |
boolean a = true, b = false;
System.out.println(!a); // false
System.out.println(a && b); // false
System.out.println(a || b); // true
// 典型用法:区间判断
int score = 75;
boolean pass = score >= 60 && score <= 100; // true短路求值
&& 与 || 具有短路特性:一旦能确定整个表达式结果,后续条件不再执行。
&&:若左边为false,右边不再计算。||:若左边为true,右边不再计算。
int x = 0;
// 左边 x > 0 为 false,右边 (1/x > 0) 不会执行,不会除零异常
boolean safe = x > 0 && (1 / x > 0); // false利用短路可以写出简洁的「先判空再使用」代码(引用类型时再学):
// 若 str 为 null,str.isEmpty() 不会执行,避免 NullPointerException
// boolean ok = str != null && str.isEmpty();位运算符(了解)
对整型的二进制位进行操作,多用于底层或性能敏感场景,初学阶段了解即可。
| 运算符 | 含义 | 示例 |
|---|---|---|
& | 按位与 | a & b |
| | 按位或 | a | b |
^ | 按位异或 | a ^ b |
~ | 按位取反 | ~a |
<< | 左移 | a << 1 |
>> | 右移(符号位填充) | a >> 1 |
>>> | 无符号右移 | a >>> 1 |
int a = 5; // 二进制 0101
int b = 3; // 二进制 0011
System.out.println(a & b); // 1:按位与
System.out.println(a | b); // 7:按位或
System.out.println(a << 1); // 10:左移一位相当于乘 2赋值运算符
= 将右侧表达式的值赋给左侧变量。与算术运算符结合可形成复合赋值:+=、-=、*=、/=、%= 等。
int n = 10;
n += 3; // 等价于 n = n + 3,n 变为 13
n -= 2; // n = 11
n *= 2; // n = 22信息
复合赋值会隐含一次类型转换。例如 byte b = 1; b += 2; 合法,而 b = b + 2; 会因 b + 2 为 int 需强转。初学用 += 即可,不必深究。
条件运算符(三元)
形式:条件 ? 值1 : 值2。若条件为 true,表达式取「值1」,否则取「值2」。适合简单的二选一赋值。
int a = 10, b = 20;
int max = a > b ? a : b; // max = 20
int score = 58;
String result = score >= 60 ? "及格" : "不及格"; // "不及格"提示
条件运算符可读性有限,若分支逻辑较复杂,建议改用 流程控制 中的 if-else。
运算符优先级与结合性
当表达式中出现多种运算符时,按优先级决定先算哪一部分;同级时一般按从左到右结合,赋值 = 从右到左。
常见优先级(从高到低,仅列常用):
- 括号
() - 一元:
!、++、--、~ - 乘除取余:
*、/、% - 加减:
+、- - 关系:
<、>、<=、>=、==、!= - 逻辑与
&&、逻辑或|| - 条件
? : - 赋值
=、+=等
建议:不依赖记忆优先级,用括号明确意图,提高可读性。
// 不推荐:依赖优先级,难读
boolean r = a > 0 && b > 0 || c > 0;
// 推荐:用括号表达意图
boolean r = (a > 0 && b > 0) || (c > 0);注意事项
整数除法与浮点结果
两个整数相除得到整数商;需要小数结果时,至少一侧转为浮点或使用浮点字面量:
System.out.println(10 / 4); // 2
System.out.println(10.0 / 4); // 2.5
System.out.println((double) 10 / 4); // 2.5取余结果的符号
取余 % 结果的符号与被除数一致(Java 规范):
System.out.println(10 % 3); // 1
System.out.println(-10 % 3); // -1
System.out.println(10 % -3); // 1浮点数不宜用 == 比较
浮点数有精度误差,应比较差值或使用 BigDecimal,不要直接用 ==:
// 不推荐
if (0.1 + 0.2 == 0.3) { }
// 推荐:比较差值
if (Math.abs((0.1 + 0.2) - 0.3) < 1e-9) { }引用类型用 equals 比较内容
== 对引用类型比较的是引用是否相同;比较内容要用 equals()(如字符串、后续学的对象)。
小结
- 算术:
+ - * / %;整数除法得整数商;++、--注意前缀与后缀对表达式值的影响。 - 关系:
== != > < >= <=,结果为boolean;引用类型比较内容用equals()。 - 逻辑:
! && ||,支持短路求值。 - 赋值:
=与+=等复合赋值。 - 条件:
条件 ? 值1 : 值2,用于简单二选一。 - 优先级:用括号明确运算顺序,避免依赖记忆。
下一步可学习 流程控制(if、switch、for、while),将运算符用于条件与循环中。