谜题24:尽情享受每一个字节
下面的程序循环遍历byte数值,以查找某个特定值。这个程序会打印出什么呢?(以下代码为正确解法)
public class BigDelight { private static final byte TARGET = (byte)0x90; public static void main(String[] args){ for(byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++){ if (b == TARGET) { System.out.print("Joy!"); } } } }
解:0x90是一个int常量,它超出了byte数值的范围。这与直觉是相悖的,因为0x90是一个两位的十六进制字面常量,每一个十六进制位都占据4个比特的位置,所以整个数值也只占据8个比特,即1个byte。合法的byte数值是从-128到+127,但是int常量0x90等于+144。系统总是强制地将一个操作数提升到与另一个操作数相匹配的类型。
因为在系统强制之前你可以考虑如下:
if (b == (byte)0x90) { System.out.print("Joy!"); }; if ((b & 0xff) == 0x90) { System.out.print("Joy!"); }
谜题25:无情的增量操作
下面的程序对一个变量重复的进行增量操作,然后打印它的值。那么这个值是什么呢?
public class Increment { public static void main(String[] args){ int j = 0; for (int i = 0; i < 100; i++) { j = j++; System.out.println(j); } } }
解:表达式j++的值等于j在执行增量操作之前的初始值。因此,前面的赋值语句首先保存j的值,然后将j设置为其值加1,最后将j复位到它的初始值。换句话说这个赋值操作等价于下面的语句序列:
int tmp = j; j = j + 1; j = tmp;
订正该程序只需从循环中移除无关的赋值操作,只留下: j++;