1. 程式人生 > >謎題4:初級問題

謎題4:初級問題

和數 需要 單獨 初級 ash 偏見 輸出 事物 運行

得啦,前面那個謎題是有點棘手,但它是有關整除的,每個人都知道整除是很麻煩的。那麽下面的程序只涉及加法,它又會打印出什麽呢?


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型字面常量本身就是一個錯誤。

謎題4:初級問題