"Java解惑之PPT1:揭秘Java中的有趣之谜"

需积分: 0 1 下载量 42 浏览量 更新于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语言的理解和掌握。