每種語言都有自己的獨特之處,或奇特的語法,或不常見的函數,或非標準的執行方式。因此,不論新丁還是老手,看著某個特性會突然醉了。文中總結了10個常被提及的「奇異」特性。
1. Javascript: + 是一個連接符
問題描述:在JS中,+ 號用在數字間,可以用作常規加法;但如果遇上字符,又可作為字符連接符。例如:’1’+ 1的結果是11。
成因分析:
根本性原因是JS屬於弱類型語言。比方說Python,同樣地使用+ 號作為字元連接符,但由於它是強型別語言,一旦發現一個字元與一個整數進行相加,它會提示這是個錯誤操作。
網友們的看法:
「問題在於這是個無法預料的強制性靜默轉換,很容易就忽略了。」匿名
「JS〜該情況。 +來進行字元連接簡直是個惡夢。 ,如果最後一條語句的回傳值不是TRUE,系統就會報錯了。
成因分析:
Perl模組中包含了初始程式碼和子程式。當模組檔案載入時,Perl會根據是否回傳TRUE來判斷程式碼是否成功執行。即使沒有初始程式碼,Perl仍然期望最後的語句需回傳TRUE,否則會報錯。
網友們的看法:
「這個通常讓我有不安的感覺。」 Drew Hall
「這是最無的用法了。
問題描述: 舉例來說,系統看到??!會把它自動轉為|,看到??(會轉為[。這很容會引起造成意想不到的結果,並且會大大降低代碼的可讀性。 「博學如Google,也一定看不懂什麼是??!??!」 Isaac 「自1977年有了三字母詞,C就變得晦澀難懂了。」Martin Beckett 4. PHP:大小寫敏感處理 問題描述: PHP對大小寫處理比較混亂,有些地方區分,有些地方不區分。成因分析: 很可能是PHP從CGI腳本集發展成成熟程式語言過程中出現的人工產品。採取駝峰命名法的原因。 。 2,3等都會被相同對待。快崩潰了!的位置。希望程式設計師本身應該承擔起維護程式碼清晰度的責任。的強制機制,我們是不是真的太懶了! ”Joris Meys 7. C:數組索引工作模式等同於指針 問題描述: 在C中,a[i]和i[a]是可以互換的,兩個寫法都能得出一樣的結果。 ) = i[a]。 」Confusion 「我想這正揭露了C語言的核心,指針和更直接地與內存打交道。 ”Michael Neale 8. Perl’s:預定義變數 問題描述:Perl有一份很長很長的特殊變數列表,裡面的名字都是十分繁雜的(儘管有對應的長英文單字)。因此,除非是Perl資深開發人員,否則反覆翻閱Perl文件是常有的事。
成因分析:
這些變數都有不同的意義,例如:進程ID($$),錯誤訊息($@),正規表示式符合($^R)。
網友們的看法:
「十分令人懊惱!」MatrixFrog
「對精簡型開發者可能是福音。」niXar
「對精簡型開發者可能是福音。」niXar
9. JavaScript:自動分號插入 問題描述: JS使用分號作為語句結束的標誌,並且會自行插入,即使是程式碼斷行的情況。因此會常常導致錯誤的出現。 成因分析: 自動化的本意是為了帶來便利,特別是對新手來說。 網友們的看法: 「如果我們設計語言的特性時,老把用戶看成是傻瓜,那是會出問題的。」Rob Van Dam 「自動分號插入是JS最讓人頭號插入是JS最讓人頭號插入是JS的地方之一。一個Integer物件。同時預設地,快取Integer物件的取值為-128到127。這樣的話,在使用==來比較兩個相同取值Integer物件時會出現問題(在-128和127之內是TRUE,其餘的是FALSE) 成因分析: 自動裝箱機制減少了程式碼輸入量,同時Integer快取提升了處理速度。 網友們的看法: 「還好我只是一名C#程式設計師。」Will 「這不算什麼錯誤,反而給了我們一個使用原始類型(如我們一個使用原始型別(booleans)進行數字處理的理由。 」RaviWallau