"Java解惑之PPT1:揭秘Java中的有趣之谜"
需积分: 0 142 浏览量
更新于2024-01-13
收藏 570KB PPT 举报
% 2) != 0;3. }
这个Puzzle主要是讲解了在判断一个数是奇数还是偶数时,使用取余操作符的陷阱。原始的写法中,我们假设一个数是奇数当且仅当它被2除的余数为1。但是这个假设其实是错误的,因为当输入的数为负数时,余数会是-1,而不是1。所以改进的写法中,我们只要判断余数不等于0即可判断一个数是否为奇数。
Puzzle 2 无限循环
1. public static void infiniteLoop() {
2. int i = 0;
3. while (i != i + 1) {
4. i = i + 1;
5. }
6. }
这个Puzzle是一个经典的无限循环问题。我们在判断i不等于i+1时进入循环,然后在循环体中给i自增1。然而,由于浮点数运算的不准确性,i+1并不总是能够得到一个完全相等的值,而是一个非常接近的值。所以条件判断永远满足,导致程序进入无限循环。
Puzzle 3 正无穷大
1. public static void positiveInfinity() {
2. double d = 1.0 / 0.0;
3. System.out.println(d);
4. }
这个Puzzle是讲解了浮点数除以0的结果。根据数学定义,任何一个数除以0都是无穷大(infinity)。但在Java中,它规定了除以0的结果为正无穷大(positive infinity)。所以当我们将1.0除以0.0时,得到的结果就是正无穷大。
Puzzle 4 双倍精度
1. public static void doubleTrouble() {
2. double d = 1.0;
3. System.out.println(d / 0);
4. }
这个Puzzle是讲解了浮点数除以0的结果。与前一个Puzzle不同的是,这里的除法操作的被除数是一个双精度浮点数。当我们将一个双精度浮点数除以0时,得到的结果是特殊值Infinity,而不是正无穷大。
Puzzle 5 十六进制的陷阱
1. public static void hexadecimalTrap() {
2. System.out.println(0x10 + 0x20);
3. System.out.println(0x10 + 0x20L);
4. }
这个Puzzle是讲解了在使用十六进制值时的陷阱。根据Java语言规范,当两个整数进行加法运算时,如果它们的最宽类型为int,则结果也是int类型。所以在打印第一行时,求和结果为0x30,这是一个十进制数,并不是期望的0x30L。而在第二行中,由于一个操作数是long类型,所以结果也会自动提升为long类型。
Puzzle 6 数字比较
1. public static void numComparison() {
2. System.out.println(3 * 0.1 == 0.3);
3. System.out.println(1 - 0.9 == 0.1);
4. }
这个Puzzle是讲解了浮点数比较时的精度问题。由于浮点数的内部表示方式是二进制的,所以对于一些十进制小数,可能无法精确表示。在第一行中,3乘以0.1的结果是近似等于0.3,但并不是精确等于0.3,所以条件判断为false。而在第二行中,由于1减去0.9的结果是精确等于0.1,所以条件判断为true。
通过以上的例子,Java解惑这本书通过一系列有趣的Puzzle,向我们展示了Java语言中一些容易被忽视或误解的细节和陷阱。这些细节包括数据类型的运算规则、浮点数的精度、溢出的处理、位操作等等。通过深入理解这些细节,我们可以更好地写出高质量的Java代码,避免一些潜在的bug和错误。这本书非常适合有一定Java编程基础的开发人员阅读,能够帮助他们提高对Java语言的理解和掌握。
2010-10-12 上传
2010-10-12 上传
2010-10-12 上传
2010-10-12 上传
2010-10-12 上传
2019-03-26 上传