奇特的程式語言特性

發表於2011-12-26

英文原文:stackoverflow,編譯:外刊IT評論

目前為止,據我個人觀察,從語法角度上講,最被人詬病的一種語言應該是LISP語言了。開啟這種語言的程式碼,一眼望去,滿目全是括弧,一層套一層。 這種語言特徵最大的問題是,它不符合人們通常的思維習慣。LISP語言的這個特點是個整體的語言現象,而任何一種語言其實也都有一些個別的很奇特的東西, 其中有些會奇怪的讓你摸不著頭腦。有一個好事者在一個帖子上徵集各種語言裡不合常理的地方,結果收集到了320多條,問題最大最多的語言算是Javascript了,另外還有C,Java,Python,PHP等等。下面列出的是其中最有趣的幾條。

1、在C語言裡,陣列可以這樣索引取值:

這種寫法相當常見。

然而,還有一種很少見的寫法(絕對可用!)是這樣的:

這兩種寫法的效果是一樣的。

2、在JavaScript裡:

3、在JavaScript裡,下面的語法結構

會提示語法錯誤:”缺少分號”。而下面的寫法卻能按你預想的結果執行:

更讓人鬱悶的是下面的寫法竟然可以(至少在谷歌瀏覽器裡是這樣的):

下面的例子也是同樣的問題引起的,但不會報錯,而你卻得不到想要的結果:

4、JavaScript的等式對照表:

5、Java裡有趣的自動打包(auto boxing)和IntegerCache:

 

解釋

在Java原始碼裡你很快能翻出下面的內容:

注意;IntegerCache.high 的值,如果你不設定它,預設是 127。

自動打包(auto boxing)過程中發生的事情是:除非顯式的建立:比如 foo = new Integer(42) ,否則 foo 和 bar 都是從快取中取出的整數,當比較值時,它們會返回 true。正確的比較Integer的方式是使用 .equals 。

6、在Java裡:

在Python和JavaScript也可以這樣寫。這樣寫的結果是什麼?當作一個保留的問題考考大家吧。

7、C++的模板可以做很多奇怪的事情,最好的例證是 “多維模擬排版”,你可以用模板來計算“畫出的”形狀。下面是一段計算一個3×3矩形的有效的C++程式碼:

這還有一個3D立方體的例子:

8、PHP處理數字字元

如果兩個字串來的字元數不相等,它們不可能相等。前面的零非常重要,因為他們是字元而不是數字。

PHP不太喜歡字元,它會尋找任何的藉口來把你提供的值當作數字。把這些十六進位制的字串稍微做些改動,PHP馬上認為它們不再是字元,而是數字。 它們是按科學計數法寫的數字(PHP並不在意你是否用了引號),它們是相等的,因為對於數字來說,前面的零是可以忽略的。更強化這個事實的例子是,你會發 現PHP認為 “01e4″ == “10000″ 是正確的,因為作為數字,它們的值是相當的。這是一個被特別提醒的語言特徵,原因就是它不太合理。

9、在一些沒有保留字、關鍵字的語言裡,例如PL/I, 你可以寫出這樣有趣而且合法的程式碼語句:

(IF, THEN, ELSE 都是變數名),或

(IF 是變數,THEN 和 ELSE 都是函式)

10、JavaScript裡八進位制的轉換:

11、在C語言裡,你可以把 do/while 語句和 switch 交織在一起,下面就是一個使用這種方法的記憶體拷貝的例子:

12、在Python中:

13、在Java中:

可以被寫成:

如果你覺得還沒看夠,請到這裡,還有更多。

相關文章