謎題4:初級問題
得啦,前面那個謎題是有點棘手,但它是有關(guān)整除的,每個人都知道整除是很麻煩的。那么下面的程序只涉及加法,它又會打印出什么呢?
public class Elementary{ public static void main(String[] args){ System.out.println(12345+5432l); } }
從表面上看,這像是一個很簡單的謎題——簡單到不需要紙和筆你就可以解決它。加號的左操作數(shù)的各個位是從1到5升序排列的,而右操作數(shù)是降序排列的。因此,相應(yīng)各位的和仍然是常數(shù),程序必定打印66666。對于這樣的分析,只有一個問題:當你運行該程序時,它打印出的是17777。難道是Java對打印這樣
的非常數(shù)字抱有偏見嗎?不知怎么的,這看起來并不像是一個合理的解釋。
事物往往有別于它的表象。就以這個問題為例,它并沒有打印出我們想要的輸出。請仔細觀察 + 操作符的兩個操作數(shù),我們是將一個int類型的12345加到了
long類型的5432l上。請注意左操作數(shù)開頭的數(shù)字1和右操作數(shù)結(jié)尾的小寫字母l之間的細微差異。數(shù)字1的水平筆劃(稱為“臂(arm)”)和垂直筆劃(稱為“莖(stem)”)之間是一個銳角,而與此相對照的是,小寫字母l的臂和莖之間是一個直角。 在你大喊“惡心!”之前,你應(yīng)該注意到這個問題確實已經(jīng)引起了混亂,這里確實有一個教訓(xùn):在long型字面常量中,一定要用大寫的L,千萬不要用小寫的l。這樣就可以完全掐斷這個謎題所產(chǎn)生的混亂的源頭。
System.out.println(12345+5432L);
相類似的,要避免使用單獨的一個l字母作為變量名。例如,我們很難通過觀察下面的代碼段來判斷它到底是打印出列表l還是數(shù)字1。
//不良代碼-使用了l作為變量名 List l = new ArrayList<String>(); l.add("Foo"); System.out.println(1);
總之,小寫字母l和數(shù)字1在大多數(shù)打字機字體中都是幾乎一樣的。為避免你的程序的讀者對二者產(chǎn)生混淆,千萬不要使用小寫的l來作為long型字面常量的
結(jié)尾或是作為變量名。Java從C編程語言中繼承良多,包括long型字面常量的語法。也許當初允許用小寫的l來編寫long型字面常量本身就是一個錯誤。