《java解惑》笔记九

第三十三题:循环者遇到了狼人

i != 0 && i == -i ,定义i,使表达式结果为true

public static void main(String[] args) {
        int i = Integer.MIN_VALUE;
        System.out.println(i != 0 && i == -i);
    }

i不能为0,还需要等于-i。在java中对一个数值取负值,需要对每一位取反,再加一。这时,int的最小值Integer.MIN_VALUE补码为0x80000000,取反后为0x7fffffff,还要加一为0x80000000。最终发现Integer.MIN_VALUE的相反数为自身。当使用Math.abs这个方法对Integer.MIN_VALUE取绝对值,也会发现等于自身。
由于int的取值范围是-2^31到2^31-1,-2^31的相反数为2^31,但是int最大值为2^31-1,会产生溢出,结果是最大值加1,溢出后是最小值,也就是本身了。

当然,使用int存储2^31,也会溢出为int最小值,只要溢出为int最小值,就能满足上面的条件,所以说这可以看作是个取模的运算。i%(2^31)==0就能满足.

第三十四题:被计数击倒了

public static void main(String[] args) {
        final int START = 2000000000;
        int count = 0;
        for(float f = START;f < START + 50;f++) {
            count++;
        }
        System.out.println(count);
        System.out.println(ChapterUtil.getIEE754FromFloat(START));
        System.out.println(ChapterUtil.getIEE754FromFloat(START+50));
        System.out.println(Math.ulp(START));
    }
//控制台打印:
//0
//4eee6b28
//4eee6b28
//128.0

这一题与第28题类似,浮点数太大的话,与它下一个浮点数之间间隔不只是1,而是一个ulp,这题的ulp是128,START+50与START其实是一样的数。没有执行循环体,直接输出count了。

第三十五题:一分钟又一分钟

public static void main(String[] args) {
        int minutes = 0;
        for(int ms = 0; ms < 60*60*1000; ms++) {
            if(ms % 60*1000 == 0)
                minutes++;
        }
        System.out.println(minutes);
    }
//控制台输出:
//60000

这道题考察了运算符的优先级与结合性,在java中%与*是相同的优先级,但是结合性是从左到右,所以会先计算ms%60,再将结果*1000。

第三十六题:优柔寡断

public static void main(String[] args) {
        System.out.println(decision());
    }
    static boolean decision() {
        try {
            return true;
        }finally {
            return false;
        }
    }
//控制台打印:
//false

程序的意外结束:在执行语句中抛出异常,或封闭区域执行break或continue,又或者执行return语句。
在try-finally语句中,先执行try语句块的内容,不管是否正常结束,还是意外结束,都会执行finally块中的内容。在try和finally中都有return,最后会执行finally的return,而不会执行try内的return。如果try有return,而finally没有,那么finally块只是副本,不会修改return的值。

public static void main(String[] args) {
        System.out.println(decision());
    }
    static int decision() {
        int i = 0;
        try {
            return i;
        }finally {
            i = 10;
            System.out.println("finally块内i:"+i);
        }
    }
//控制台输出:
//finally块内i:10
//0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aabond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值