Java谜题解析:取余操作符的陷阱

需积分: 9 1 下载量 168 浏览量 更新于2024-07-27 收藏 1.19MB PDF 举报
"Java解惑书籍内容探讨了Java编程中的一些常见问题,特别是关于‘表达式谜题’的章节,关注于Java中的取余运算符 `%` 的特殊行为及其在判断奇数时可能导致的错误。" 在Java编程中,开发者可能会遇到各种各样的问题,而“Java解惑”这本书通过一系列的谜题来揭示这些问题的本质,帮助程序员提升技能。书中提到了一个特定的谜题——表达式谜题1,涉及判断整数是否为奇数的方法。这个方法基于`i % 2 == 1`的条件来检查参数`i`是否为奇数。看似简单的逻辑却隐藏了一个陷阱,因为它在处理负奇数时会出现错误。 Java的取余运算符 `%` 的行为是:对于任何整数`a`和非零整数`b`,`(a/b)*b + (a%b) == a`总是成立的。这意味着取余操作符返回的余数与原始操作数有相同的符号。当`i`是负奇数时,`i % 2`实际上是-1,而不是预期的1,导致`isOdd`方法错误地返回`false`。 为了解决这个问题,开发者应确保在编写此类函数时充分考虑边界条件,如负数、零和正数。一个修复方案是改变条件,比较`i % 2`是否不等于0,如下所示: ```java public static boolean isOdd(int i) { return i % 2 != 0; } ``` 此外,对于性能要求高的场景,可以使用位操作符`AND (&)`来替代取余操作符,这通常会更快: ```java public static boolean isOdd(int i) { return (i & 1) != 0; } ``` 在这个解决方案中,`i & 1`的结果只有在`i`是奇数时才会为1,因为1的二进制表示只有一个1在最低位,与`i`进行按位与操作后,如果`i`是奇数,结果中最低位的1会被保留下来,否则将为0。 这个谜题提醒我们,理解和熟悉编程语言的底层细节至关重要。在编写代码时,不仅要考虑正常情况,还要充分考虑异常和边界情况。Java的取余运算符行为在非负数时是直观的,但在负数情况下则需要注意其特殊性。因此,深入理解运算符的行为并进行适当的测试是避免类似问题的关键。
2011-05-08 上传
********Shenkxiao Resources******** 压缩包密码:shenkxiao 资源:Java解惑(中文版)、java puzzlers traps pitfalls,and Corner Cases 作者:Joshua Bloch Neal Gafter 版本:中文版 主要内容: Java解惑(英文版)—典藏原版书苑 目录 1 introduction 2 expressive puzzlers puzzle 1:oddity puzzle 2:time for a change puzzle 3:long pision puzzle 4:it s elementary puzzle 5:the joy of hex puzzle 6:multicast puzzle 7:swap meat puzzle 8:dos equis puzzle 9:tweedildum puzzle 10:tweedledee 3 przzlers with character puzzle 11:the last laugh puzzle 12:abc puzzle 13:animal farm puzzle 14:escape rout puzzle 15:hello whirled puzzle 16:line printer puzzle 17:huh? puzzle 18:string cheese puzzle 19:classy fire puzzle 20:what s my class? puzzle 21:what s my class,take2 puzzle 22:dupe of url puzzle 23:no pain,no gain 4 loopy puzzlers puzzle 24:a big delight in every byte puzzle 25:inclement increment puzzle 26:in the loop puzzle 27:shifty i s puzzle 28:looper puzzle 29:bride of loper puzzle 30:son of loper puzzle 31:ghost of looper puzzle 32:curse of looper puzzle 33:looer meets the wolfman puzzle 34:down for the count puzzle 35:minute by minute 5 exceptonal puzzlers 6 classy puzzlers 7 library puzzlers 8 classier puzzlers 9 more library puzzlers 10 advanced puzzlers a catalog of traps and pitfalls b notes on the illusions refereces index 本书深入研究Java编程语言及其核心类为的细微之处,特写95个有关Java或其他类库的陷阱和缺陷的谜题,其中大多数谜题都采用短程序的形式给出。在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上迥异的程序行为的简单解释的同时,更向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。本书附录部分列出了陷阱及缺陷的目录,可供读者进一学习参考。 本书以轻松诙谐的语言,寓教于乐的方式,由浅入深、总结归纳Java编程语言的知识点,适合具有Java知识的学习者和有编程经验的Java程序员阅读。 上传理由:精品典藏共享,网络上下载该资源太费劲,我来共享吧 因为是精品所以分数也比较高。 ***********************************