随笔 - 9  文章 - 21  trackbacks - 0
<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(1)

随笔分类(9)

随笔档案(9)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

第 4 天的问题 -- 眼花缭乱

它又会打印出什么呢?


public class Elementary{
    public static void main(String[] args){
        System.out.println(12345 + 5432l);
    }
}

第 4 天问题的解答

这个题看起来似乎太简单了。结果不就是66666吗?

遗憾的告诉你,结果是17777。

原因

事物往往有别于它的表象。就以这个问题为例,它并没有打印出我们想要的输出。请仔细观察 + 操作符的两个操作数, 我们是将一个int类型的12345加到了long类型的5432l上。请注意左操作数开头的数字1和右操作数结尾的小写字母l之间的细微差异。 数字1的水平笔划(称为"臂(arm)")和垂直笔划(称为"茎(stem)")之间是一个锐角,而与此相对照的是,小写字母l的臂和茎之间是一个直角。

解决办法

System.out.println(12345+5432L);

用大写的L替换小写字母l。

第 4 天问题的总结

在你大喊"恶心!"之前,你应该注意到这个问题确实已经引起了混乱,这里确实有一个教训: 在long型字面常量中,一定要用大写的L,千万不要用小写的l。这样就可以完全掐断这个谜题所产生的混乱的源头。

相类似的,要避免使用单独的一个l字母作为变量名。例如,我们很难通过观察下面的代码段来判断它到底是打印出列表l还是数字1。

//不良代码-使用了l作为变量名
List l = new ArrayList<String>();
l.add("Foo");
System.out.println(1);

也许当初允许用小写的l来编写long型字面常量本身就是一个错误。


今天的问题

下面的程序是对两个十六进制(hex)字面常量进行相加,然后打印出十六进制的结果。这个程序会打印出什么呢?

public class JoyOfHex {
    public static void main(String[] args) {
        System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
    }
}
posted on 2008-05-17 00:33 李四飞刀 阅读(1268) 评论(2)  编辑  收藏 所属分类: 每日一题

FeedBack:
# re: 第 5 天: 解答 -- 眼花缭乱, 问题 -- 16进制的趣事 2008-05-17 17:09 ztc
哈哈,我的确喊恶心了,不过说得有道理!  回复  更多评论
  
# re: 第 5 天: 解答 -- 眼花缭乱, 问题 -- 16进制的趣事 2008-05-26 14:03 懒人
要都是那么写,调bug都得得近视~~  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: