循环谜题(谜题均转自JAVA学习宝典)

来源:互联网 发布:手机怎么制作软件程序 编辑:程序博客网 时间:2024/04/28 15:34

谜题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++;

0 0
原创粉丝点击