讲解
运算符是对数据做操作的符号。算术运算符最直观:+、-、*、/ 四则运算,% 取余数(7 % 3 得 1)。要特别注意除法的行为取决于操作数类型:两个 int 相除做整数除法(丢弃小数),只要有一个是 double 就做浮点除法。% 常用来判断奇偶(n % 2 == 0)和「每 N 个循环一次」的场景。
自增自减 ++、-- 让变量加一或减一,但放前放后含义不同:++x 先加再用新值,x++ 先用旧值再加——在表达式里混用极易看错,工程实践建议自增单独成行,不嵌进别的表达式。复合赋值 +=、-=、*=、/= 是「先算再赋回」的简写:count += 5 等价于 count = count + 5。
比较运算符 ==、!=、>、>=、<、<= 的结果是 boolean,专门服务于后面的条件判断。逻辑运算符 &&(与)、||(或)、!(非)组合多个布尔条件,&& 和 || 都有「短路」特性:左边已经能确定结果时右边不再执行——a != null && a.length() > 0 能安全运行,正因为 a 为 null 时右侧不会求值。三目运算符 条件 ? 值1 : 值2 是 if...else 的表达式版,适合简单的二选一赋值。
示例
算术运算:注意整数除法与浮点除法的差别,以及取余的用途:
public class Main {
public static void main(String[] args) {
int a = 7, b = 2;
System.out.println("7 / 2 = " + (a / b));
System.out.println("7.0 / 2 = " + (7.0 / b));
System.out.println("7 % 2 = " + (a % b));
for (int n = 1; n <= 5; n++) {
System.out.println(n + " 是" + (n % 2 == 0 ? "偶数" : "奇数"));
}
}
}
自增的前后位置差别,以及复合赋值:
public class Main {
public static void main(String[] args) {
int x = 5;
System.out.println("x++ 的值:" + (x++));
System.out.println("之后 x = " + x);
System.out.println("++x 的值:" + (++x));
int score = 60;
score += 15;
score *= 2;
System.out.println("最终分数:" + score);
}
}
逻辑运算的短路特性保护了右侧的空指针风险:
public class Main {
public static void main(String[] args) {
String name = null;
boolean ok = name != null && name.length() > 3;
System.out.println("name 有效且较长?" + ok);
int age = 19;
String level = age >= 18 ? "成年人" : "未成年人";
System.out.println(age + " 岁是" + level);
System.out.println("!(age >= 18) = " + !(age >= 18));
}
}
常见坑
- 把 == 写成 =:if (x = 5) 在 Java 里对 int 会直接编译报错(不像 C 语言那样埋雷),但布尔变量 if (flag = true) 能编译通过且永远为真,极其隐蔽。
- 用 == 比较字符串:字符串是对象,== 比较的是地址而不是内容。判断内容相等用 equals 方法,字符串章节会详细展开。
- 自增嵌进复杂表达式:arr[i++] = i++ 这类写法读三遍都不敢确定结果。自增单独成行,表达式保持简单。
- 忽略短路求值的顺序:写成 list.size() > 0 && list != null 就把保护条件放反了,空指针照样炸。把「可能为空的判断」放在 && 左边。
小结
算术、自增、比较、逻辑、三目五类运算符覆盖日常计算;整数除法丢小数,&&/|| 会短路,字符串比较别用 ==。下一节深入学习最常用的引用类型:字符串。