java算术运算符易在类型转换和优先级上出错:整数除法截断、%对负数返回余数、++/--位置影响表达式值、位运算优先级低于关系运算。

Java 里的算术运算符不是“学不会”,而是容易在类型转换和优先级上栽跟头——尤其当 int 和 double 混用,或除法结果被意外截断时。
为什么 / 在两个 int 之间总是丢小数?
Java 的整数除法天生截断,不四舍五入也不报错。比如 7 / 2 结果是 3,不是 3.5;这不是 bug,是语言设计决定的。
- 想保留小数:至少让其中一个操作数是
double,例如7.0 / 2或(double) 7 / 2 - 别写
7 / 2 * 1.0——乘法在除法之后才执行,结果仍是3.0,没意义 - 如果变量是
int类型,强制转double要尽早,比如(double) a / b,而不是a / b * 1.0
% 运算符不只是“取余”,它其实是“取模”,但 Java 里它对负数返回的是余数(有符号)
比如 -5 % 3 得 -2,不是 1;这和 Python 的 % 行为不同,也和数学中常说的“模”不完全等价。
- 需要真正非负结果(比如做数组索引):用
((a % n) + n) % n安全兜底 -
%左右操作数类型必须一致,5L % 2合法,但5 % 2.0编译失败——浮点数不支持% - 对
0取模会抛ArithmeticException,运行时错误,编译器不检查
自增/自减 ++ 和 -- 的位置影响值,不是只影响变量本身
很多人以为 i++ 就是“先用后加”,但关键在于:这个“用”指的是表达式求值时取哪个值,而加法动作发生在整个表达式之后(但仍在当前语句内完成)。
-
int i = 1; int j = i++ + i;→j是1 + 2 = 3,不是1 + 1;i最终为2 - 嵌套调用中慎用:
list.get(i++)和list.get(++i)可能跳过元素或越界,建议拆成两行 - 不要在同一个表达式里多次修改同一变量,如
i = i++ + ++i,行为未定义(虽然 Java 规范定义了,但极易出错且难调试)
最常被忽略的其实是运算符优先级组合,比如 a + b * c 没问题,但 a == b & c == d 里 & 的优先级低于 ==,实际等价于 (a == b) & (c == d) —— 看似合理,可一旦换成 && 或混用位运算,括号就不再是可选项。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











