下面的程序只涉及加法,它又会打印出什么呢?
public class Elementary {
public static void main(String[] args){
System.out.println(12345+5432l);
}
}
从表面上看,这像是一个很简单的谜题——简单到不需要纸和笔你就可以解决
它。加号的左操作数的各个位是从 1 到5 升序排列的,而右操作数是降序排列的。
因此,相应各位的和仍然是常数,程序必定打印 66666。对于这样的分析,只有
一个问题:当你运行该程序时,它打印出的是17777。难 是Java 对打印这样
的非常数字抱有偏见吗?不知怎么的,这看起来并不像是一个合理的解释。
事物往往有别于它的表象。就以这个问题为例,它并没有打印出我们想要的输出。
请仔细观察 + 操作符的两个操作数,我们是将一个 int类型的 12345 加到了
long 类型的 5432l 上。请注意左操作数开头的数字 1 和右操作数结尾的小写字
母 l 之间的细微差异。数字 1 的水平笔划 (称为 “臂 (arm)”)和垂直笔划 (称
为 “茎 (stem)”)之间是一个锐角,而与此相对照的是,小写字母 l 的臂和茎
之间是一个直角。
在你大喊 “恶心 !”之前,你应该注意到这个问题确实已经引起了混乱,这里确
实有一个教训:在 long 型字面常量中,一定要用大写的L,千万不要用小写的 l。
这样就可以完全掐断这个谜题所产生的混乱的源头。
System.out.println(12345+5432L);
相类似的,要避免使用单独的一个 l 字母作为变量名。例如,我们很难通过观察
下面的代码段来判断它到底是打印出列表 l 还是数字 1。
//不良代码-使用了 l 作为变量名
List l = new ArrayList<String> ();
l.add("Foo");
System.out.println(1);
总之,小写字母 l 和数字 1 在大多数打字机字体中都是几乎一样的。为避免你的
程序的读者对二者产生混淆,千万不要使用小写的l 来作为 long 型字面常量的
结尾或是作为变量名。Java从 C 编程语言中继承良多,包括 long 型字面常量的
语法。也许当初允许用小写的l 来编写 long 型字面常量本身就是一个错误。