Skip to content

运算符

概述

运算符用于对变量或字面量进行运算,与操作数一起组成表达式,得到结果或产生副作用。Java 中的运算符按功能分为:算术、关系、逻辑、位、赋值、条件(三元)等。掌握运算符的语义与优先级,是正确书写条件判断和数学运算的基础。

本文介绍各类运算符的用法、运算中的类型提升,以及整数除法、短路求值等常见注意点。

前置建议

已掌握 变量与数据类型,了解 intdoubleboolean 等类型及字面量写法。


算术运算符

用于数值的加减乘除与取余,以及自增、自减。

基本算术:+ - * / %

运算符含义示例
+加法a + b
-减法a - b
*乘法a * b
/除法a / b
%取余数a % b
java
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:余数

注意

两个整数相除 / 得到的是整数商,小数部分被截断。若要得到小数结果,至少有一个操作数为浮点类型(或先强转)。

java
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++:先取当前值作为表达式结果,再自增。
java
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 降低可读性。


关系运算符(比较)

用于比较两个值,结果为 booleantruefalse)。常用于 流程控制 中的条件判断。

运算符含义示例
==相等a == b
!=不相等a != b
>大于a > b
<小于a < b
>=大于等于a >= b
<=小于等于a <= b
java
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

运算符含义说明
!逻辑非取反,!truefalse
&&逻辑与两边都为 true 才为 true
||逻辑或任一边为 true 即为 true
java
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,右边不再计算。
java
int x = 0;
// 左边 x > 0 为 false,右边 (1/x > 0) 不会执行,不会除零异常
boolean safe = x > 0 && (1 / x > 0);  // false

利用短路可以写出简洁的「先判空再使用」代码(引用类型时再学):

java
// 若 str 为 null,str.isEmpty() 不会执行,避免 NullPointerException
// boolean ok = str != null && str.isEmpty();

位运算符(了解)

对整型的二进制位进行操作,多用于底层或性能敏感场景,初学阶段了解即可。

运算符含义示例
&按位与a & b
|按位或a | b
^按位异或a ^ b
~按位取反~a
<<左移a << 1
>>右移(符号位填充)a >> 1
>>>无符号右移a >>> 1
java
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

赋值运算符

= 将右侧表达式的值赋给左侧变量。与算术运算符结合可形成复合赋值:+=-=*=/=%= 等。

java
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 + 2int 需强转。初学用 += 即可,不必深究。


条件运算符(三元)

形式:条件 ? 值1 : 值2。若条件为 true,表达式取「值1」,否则取「值2」。适合简单的二选一赋值。

java
int a = 10, b = 20;
int max = a > b ? a : b;   // max = 20

int score = 58;
String result = score >= 60 ? "及格" : "不及格";  // "不及格"

提示

条件运算符可读性有限,若分支逻辑较复杂,建议改用 流程控制 中的 if-else


运算符优先级与结合性

当表达式中出现多种运算符时,按优先级决定先算哪一部分;同级时一般按从左到右结合,赋值 = 从右到左。

常见优先级(从高到低,仅列常用):

  1. 括号 ()
  2. 一元:!++--~
  3. 乘除取余:*/%
  4. 加减:+-
  5. 关系:<><=>===!=
  6. 逻辑与 &&、逻辑或 ||
  7. 条件 ? :
  8. 赋值 =+=

建议:不依赖记忆优先级,用括号明确意图,提高可读性。

java
// 不推荐:依赖优先级,难读
boolean r = a > 0 && b > 0 || c > 0;

// 推荐:用括号表达意图
boolean r = (a > 0 && b > 0) || (c > 0);

注意事项

整数除法与浮点结果

两个整数相除得到整数商;需要小数结果时,至少一侧转为浮点或使用浮点字面量:

java
System.out.println(10 / 4);           // 2
System.out.println(10.0 / 4);         // 2.5
System.out.println((double) 10 / 4);  // 2.5

取余结果的符号

取余 % 结果的符号与被除数一致(Java 规范):

java
System.out.println(10 % 3);   // 1
System.out.println(-10 % 3);  // -1
System.out.println(10 % -3);  // 1

浮点数不宜用 == 比较

浮点数有精度误差,应比较差值或使用 BigDecimal,不要直接用 ==

java
// 不推荐
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),将运算符用于条件与循环中。


相关链接

基于 VitePress 构建