【从零开始java学习|第六篇】运算符的使用与注意事项
目录
一、算术运算符
1. 基本算术运算符(二元)
2. 自增 / 自减运算符(一元)
二、类型转换(隐式与强制)
1. 隐式转换(自动类型转换)
编辑
2. 强制转换(显式类型转换)
三、字符串和字符的 “+” 操作
四、赋值运算符
1. 基本赋值运算符(=)
2. 复合赋值运算符
五、关系运算符
六、逻辑运算符
1. 基本逻辑运算符(非短路)
2. 短路逻辑运算符
七、三元运算符
八、运算符优先级
九、总结
运算符是 Java 中用于执行运算的特殊符号,是程序逻辑实现的基础。根据功能不同,Java 运算符可分为算术运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符等,且各类运算符存在明确的优先级规则。本文将系统总结各类运算符的特性、使用场景及注意事项。
一、算术运算符
算术运算符用于执行基本的数学运算,包括二元运算符(需两个操作数)和一元运算符(需一个操作数)。
1. 基本算术运算符(二元)
运算符 | 功能 | 示例 | 说明 |
---|---|---|---|
+ | 加法 | 3 + 5 = 8 | 数字相加或字符串 / 字符拼接(见后文) |
- | 减法 | 10 - 4 = 6 | 数字相减 |
* | 乘法 | 2 * 6 = 12 | 数字相乘 |
/ | 除法 | 7 / 2 = 3 | 整数除法取商(非四舍五入);浮点数除法正常计算(7.0 / 2 = 3.5 ) |
% | 取模(余) | 7 % 2 = 1 | 结果符号与被除数一致(-7 % 2 = -1 ,7 % -2 = 1 ) |
2. 自增 / 自减运算符(一元)
用于操作数自身加 1 或减 1,分为前缀(先运算后使用)和后缀(先使用后运算)两种形式。
运算符 | 功能 | 前缀示例(++a) | 后缀示例(a++) |
---|---|---|---|
++ | 自增(+1) | int a=3; int b=++a; → a=4, b=4 | int a=3; int b=a++; → a=4, b=3 |
-- | 自减(-1) | int a=3; int b=--a; → a=2, b=2 | int a=3; int b=a--; → a=2, b=3 |
注意:自增 / 自减运算符仅能作用于变量(如5++
为错误写法),且在复杂表达式中需注意优先级(见后文)。
二、类型转换(隐式与强制)
当不同数据类型的操作数参与运算时,会发生类型转换,确保运算统一。
1. 隐式转换(自动类型转换)
- 规则:小范围类型自动转换为大范围类型(避免精度损失),转换顺序为:
byte → short → int → long → float → double
(char
可转换为int
,因字符对应 ASCII 码)。 - 示例:
int a = 10; long b = a; // 正确:int(4字节)→ long(8字节) float c = 3.14f; double d = c; // 正确:float → double
2. 强制转换(显式类型转换)
- 规则:大范围类型需手动转换为小范围类型,语法为
(目标类型) 操作数
。 - 注意:可能导致精度损失或溢出(需手动控制风险)。
- 示例:
double a = 3.9; int b = (int) a; // 结果为3(精度损失) long c = 10000000000L; int d = (int) c; // 结果为-2147483648(溢出,因int范围为-2^31~2^31-1)
一个练习进行记忆
三、字符串和字符的 “+” 操作
“+” 在 Java 中除算术加法外,还可用于字符串拼接或字符与其他类型的混合运算,规则如下:
-
字符串与任何类型拼接:结果为字符串(其他类型自动转换为字符串)。
示例:String s = "age: " + 18; // 结果为 "age: 18" String s2 = "a" + true; // 结果为 "atrue"
-
多个 “+” 连续运算:从左到右执行,若左侧出现字符串,则后续均为拼接;否则先执行算术运算。
示例:int a = 10; String s3 = 5 + 3 + "a"; // 先算5+3=8,再拼接 → "8a" String s4 = "a" + 5 + 3; // 从左到右拼接 → "a53"
-
字符(char)与数字相加:char 会转换为对应 ASCII 码(int 类型),执行算术加法。
示例:char c = 'a'; // ASCII码为97 int sum = c + 1; // 结果为98('b'的ASCII码)
四、赋值运算符
赋值运算符用于将右侧值赋给左侧变量,包括基本赋值和复合赋值。
1. 基本赋值运算符(=)
- 功能:将右侧表达式结果赋给左侧变量(左侧必须是可修改的变量,不能是常量)。
- 示例:
int a = 5;
2. 复合赋值运算符
复合赋值是 “算术运算 + 赋值” 的简写,语法为 变量 运算符= 操作数
,等价于 变量 = (变量类型)(变量 运算符 操作数)
(隐含强制转换)。
运算符 | 等价写法 | 示例 |
---|---|---|
+= | a += b → a = (a类型)(a + b) | short s=1; s += 2; → 正确(隐含 short 转换) |
-= | a -= b → a = (a类型)(a - b) | int a=5; a -= 3; → a=2 |
*= | a *= b → a = (a类型)(a * b) | double d=2; d *= 3; → d=6 |
/= | a /= b → a = (a类型)(a / b) | int a=10; a /= 3; → a=3 |
%= | a %= b → a = (a类型)(a % b) | int a=7; a %= 3; → a=1 |
注意:复合赋值的隐含强制转换可避免部分类型错误,例如 short s=1; s = s + 2;
会报错(s+2 为 int),但 s += 2
正确。
五、关系运算符
关系运算符用于判断两个操作数的关系,结果为boolean 类型(true
或 false
)。
运算符 | 功能 | 示例 |
---|---|---|
== | 等于 | 3 == 5 → false |
!= | 不等于 | 3 != 5 → true |
> | 大于 | 5 > 3 → true |
< | 小于 | 5 < 3 → false |
>= | 大于等于 | 5 >= 5 → true |
<= | 小于等于 | 3 <= 2 → false |
注意:
- 区分
==
(判断相等)和=
(赋值),例如if(a=3)
会恒为true
(因赋值结果为 3,非 0 即真),是常见错误。 - 引用类型的
==
判断地址是否相同,而非内容(内容判断需用equals()
方法)。
六、逻辑运算符
逻辑运算符用于连接 boolean 表达式,执行逻辑判断,结果为 boolean 类型。
1. 基本逻辑运算符(非短路)
运算符 | 功能 | 运算规则(a、b 为 boolean) | 示例 | ||
---|---|---|---|---|---|
& | 逻辑与(且) | 全为 true 则 true,否则 false | true & false → false | ||
逻辑或(或) | 至少一个 true 则 true,全 false 则 false | `true | false → true` | ||
! | 逻辑非(取反) | true→false,false→true | !true → false | ||
^ | 逻辑异或 | 两个结果不同则 true,相同则 false | true ^ true → false |
特点:无论左侧结果如何,右侧表达式都会执行(例如 (3>5) & (a++)>0
中,a++
会执行)。
2. 短路逻辑运算符
运算符 | 功能 | 运算规则(a、b 为 boolean) | 示例 | ||||
---|---|---|---|---|---|---|---|
&& | 短路与 | 左侧为 false 时,右侧不执行,结果为 false;左侧为 true 时,需判断右侧 | (3>5) && (a++)>0 → a 不变 | ||||
短路或 | 左侧为 true 时,右侧不执行,结果为 true;左侧为 false 时,需判断右侧 | `(3<5) | (a++)>0→ a` 不变 |
优势:短路特性可提高效率(避免无用计算),例如 if(obj != null && obj.getValue() > 0)
可避免空指针异常(若 obj 为 null,右侧不执行)。
七、三元运算符
三元运算符是 Java 中唯一的三目运算符,语法为:
条件表达式 ? 表达式1 : 表达式2
-
功能:条件表达式为 true 时,执行表达式 1;否则执行表达式 2。
-
示例:
int max = (5 > 3) ? 5 : 3; // 结果为5 String res = (score >= 60) ? "及格" : "不及格";
-
注意:表达式 1 和表达式 2 的类型必须兼容(可自动转换或显式转换),否则编译报错。例如
(3>2) ? 1 : 2.0
会报错(int 与 double 不兼容)。
八、运算符优先级
当多个运算符混合使用时,优先级决定执行顺序(优先级高的先执行),可通过括号 ()
改变优先级(括号优先级最高)。从高到低的优先级顺序如下:
- 括号:
()
- 单目运算符:
++
、--
、!
- 算术运算符:
*
、/
、%
(高于+
、-
) - 关系运算符:
>
、<
、>=
、<=
(高于==
、!=
) - 逻辑运算符:
!
(高于&&
,&&
高于||
) - 三元运算符:
? :
- 赋值运算符:
=
、+=
、-=
等
示例:
int a = 3;
int b = 5;
int c = a + b * 2; // 先算b*2=10,再算a+10 → 13
int d = (a + b) * 2; // 括号优先,先算a+b=8,再*2 → 16
boolean e = a > 2 && b < 4 || !false; // 等价于 (a>2 && b<4) || true → false || true → true
九、总结
Java 运算符是程序逻辑的基础,掌握各类运算符的功能、转换规则、短路特性及优先级,可避免常见错误(如整数除法精度问题、短路逻辑的副作用、==
与 =
混淆等)。实际开发中,建议通过括号明确运算顺序,提高代码可读性。
通过合理使用运算符,能高效实现数值计算、逻辑判断、变量赋值等核心功能,是 Java 编程的必备技能。