Java解惑:常见错误与表达式陷阱

需积分: 0 0 下载量 100 浏览量 更新于2024-11-05 收藏 772KB DOC 举报
"Java编程中的常见问题解答,包括对表达式和运算符的理解" 在Java编程中,理解语言的细节和运算符的行为至关重要,这有助于避免潜在的错误并编写出高效可靠的代码。以下是对两个Java谜题的深入解析: 谜题1——表达式谜题 该谜题涉及到Java中的取余运算符 `%`。方法 `isOdd(int i)` 的目的是判断传入的整数是否为奇数。初看之下,`i % 2 == 1` 这个表达式似乎能够正确工作,因为它检查i除以2的余数是否为1。然而,问题在于,当i为负奇数时,如-3,`-3 % 2` 实际上会返回-1,而不是预期的1,导致方法返回错误的结果。 Java的取余运算符 `%` 遵循这样的规则:`(a / b) * b + (a % b) == a`,这意味着取余操作的结果与原始操作数的符号相同。当i为负数时,取余结果也为负数,所以当i为负奇数时,`i % 2` 的结果是-1,而非1。 为了解决这个问题,我们可以修改`isOdd`方法,使其不与1比较,而是与0比较,并反转条件,如:`return i % 2 != 0;`。这样,无论是正奇数还是负奇数,当余数不为0时,方法都将正确返回true。 此外,为了优化性能,特别是在关键操作中,可以使用位操作符 `AND (&)` 来替代取余运算符。因为 `i & 1` 将只检查最低位(二进制表示中最右边的一位),这正是奇偶性的标志。如果最低位为1,那么整数就是奇数,所以 `return (i & 1) != 0;` 也能正确实现功能,而且速度更快。 谜题2——找零时刻 这是一个简单的数学问题,但也是对逻辑思维的挑战。Tom需要找回的零钱应该是支付金额与商品价格之差。如果商品价格是$1.10,而Tom支付了$2.00,那么找零应该是$2.00 - $1.10 = $0.90。尽管这个问题与Java编程直接关联不大,但它提醒我们在处理货币计算时要精确无误,尤其是在实际应用中,需要考虑货币的精度和舍入规则。 这两个谜题展示了Java中运算符的微妙之处以及在编写代码时对边界情况和异常值进行充分测试的重要性。理解这些基础知识可以帮助开发者写出更加健壮和高效的代码。在遇到类似问题时,一定要注意运算符的行为,特别是当涉及到负数时,同时也要考虑各种可能的输入值,确保代码的鲁棒性。