每種語言都有自己的獨(dú)到之處,或奇特的語法,或不常見的函數(shù),或非標(biāo)準(zhǔn)的執(zhí)行方式。因此,不論新丁還是老手,看著某個(gè)特性會(huì)突然醉了。文中總結(jié)了10個(gè)經(jīng)常被提及的“奇異”特性。
1. Javascript: + 是一個(gè)連接符
問題描述:
在JS中,+ 號(hào)用在數(shù)字間,可以用作常規(guī)加法;但如果遇上字符,又可作為字符連接符。例如:'1'+ 1的結(jié)果是11。
成因分析:
根本性原因是JS屬于弱類型語言。比方說Python,同樣地使用+ 號(hào)作為字符連接符,但由于它是強(qiáng)類型語言,一旦發(fā)現(xiàn)一個(gè)字符與一個(gè)整數(shù)進(jìn)行相加,它會(huì)提示這是個(gè)錯(cuò)誤操作。
網(wǎng)友們的看法:
“問題在于這是個(gè)無法預(yù)料的強(qiáng)制性靜默轉(zhuǎn)換,很容易就忽略了?!蹦涿?/p>
“JS應(yīng)該就該情況作異常拋出處理?!?crgwbr
“用+來進(jìn)行字符連接簡直是個(gè)噩夢?!?Matteo Riva
2. Perl:模塊必須返回TRUE值
問題描述:
絕大多數(shù)情況下,Perl模塊在結(jié)束時(shí)候,都必須以1;語句來結(jié)尾,否則,如果最后一條語句的返回值不是TRUE,系統(tǒng)就會(huì)報(bào)錯(cuò)了。
成因分析:
Perl模塊中包含了初始代碼和子程序。當(dāng)模塊文件被載入時(shí),Perl會(huì)根據(jù)是否返回TRUE來判斷代碼是否成功執(zhí)行。即使沒有初始代碼,Perl仍然期望最后的語句需返回TRUE,否則會(huì)報(bào)錯(cuò)。
網(wǎng)友們的看法:
“這個(gè)通常讓我有不安的感覺。” Drew Hall
“這是最無實(shí)用價(jià)值的用法了。”Schwern
3. C/C++:三字母詞用法
問題描述:
舉例來說,系統(tǒng)看到??!會(huì)把它自動(dòng)轉(zhuǎn)為|,看到??(會(huì)轉(zhuǎn)為[。這很容會(huì)引起造成意想不到的結(jié)果,并且會(huì)大大降低代碼的可讀性。
成因分析:
早期進(jìn)行編程時(shí),鍵盤上還不能直接打出某些特殊字符,例如大括號(hào)。因此用了這種間接的方法。
網(wǎng)友們的看法:
“博學(xué)如谷歌,也一定看不懂什么是??!??!” Isaac
“自1977年有了三字母詞,C就變得晦澀難懂了?!盡artin Beckett
4. PHP:大小寫敏感處理
問題描述:
PHP對(duì)大小寫處理比較混亂,有些地方區(qū)分,有些地方不區(qū)分。例如:變量名,常量名區(qū)分;函數(shù)名,方法名,類名不區(qū)分。
成因分析:
很可能是PHP從CGI腳本集發(fā)展成成熟編程語言過程中出現(xiàn)的人工產(chǎn)品。
網(wǎng)友們的看法:
“這是為什么PHP程序員習(xí)慣用下劃線進(jìn)行函數(shù)命名,而不是采取駝峰命名法的原因?!眕aperstreet7
“在PHP中,一切皆有可能!”Grzechooo
5. Ruby:0作為真值
問題描述:
在Ruby中,0值等同于TRUE值。這對(duì)有C,Python基礎(chǔ)的程序員來說不可不謂是一場噩夢。
成因分析:
只有布爾值FALSE和nil等價(jià)于FALSE,其余的都等同于TRUE。0與1,2,3等都會(huì)被相同對(duì)待。
網(wǎng)友們的看法:
“這簡直是讓人抓狂,雖然初衷是善意的。”Chris Lutz
“0==true!我這個(gè)C語言腦袋都快崩潰了!”Kenny
6. Python:以空格數(shù)進(jìn)行層次劃分
問題描述:
不同于采用關(guān)鍵字或標(biāo)點(diǎn)符,PY中采用縮進(jìn)層級(jí)來進(jìn)行層次劃分,以明確每一行代碼的位置。不正確的空格數(shù)(或空格和換位符數(shù)不一致)都可能造成程序報(bào)錯(cuò)。
成因分析:
PY作者的意圖是希望代碼更為可讀,減少不必要的輸入,并希望程序員本身應(yīng)該承擔(dān)起維護(hù)代碼清晰度的責(zé)任。
網(wǎng)友們的看法:
“由衷地說,這是使我對(duì)PY敬而遠(yuǎn)之的根本原因。”wazoox
“如果我們真的需要類似的強(qiáng)制機(jī)制,我們是不是真的太懶了!”Joris Meys
7. C:數(shù)組索引工作模式等同于指針
問題描述:
在C中,a[i]和i[a]是可以互換的,兩個(gè)寫法都能得出一樣的結(jié)果。
成因分析:
在C中,對(duì)內(nèi)存塊而言,數(shù)組與指針是無差別的,就是說:
a[i] = *(a + i) = *(i + a) =i[a]。
網(wǎng)友們的看法:
“在C語言混亂代碼比賽中,這毫無價(jià)值可言?!盋onfusion
“我想這正正揭露了C語言的核心,指針和更直接地與內(nèi)存打交道?!盡ichael Neale
8. Perl's:預(yù)定義變量
問題描述:
Perl有一份很長很長的特殊變量列表,里面的名字都是十分繁雜的(盡管有對(duì)應(yīng)的長英文單詞)。因此,除非是Perl資深開發(fā)人員,否則反復(fù)翻閱Perl文檔是常有的事。
成因分析:
這些變量都有不同的含義,例如:進(jìn)程ID($$),錯(cuò)誤信息($@),正則表達(dá)式匹配($^R)。
網(wǎng)友們的看法:
“十分令人懊惱!”MatrixFrog
“對(duì)精簡型開發(fā)者可能是福音。”niXar
“這些變量的問題是:無法通過谷歌查找得到!” malvim
9. JavaScript:自動(dòng)分號(hào)插入
問題描述:
JS使用分號(hào)作為語句結(jié)束的標(biāo)志,并且會(huì)自行插入,即使是代碼斷行的情況。因此會(huì)常常導(dǎo)致錯(cuò)誤的出現(xiàn)。
成因分析:
自動(dòng)化的本意是為了帶來便利,特別是對(duì)新手來說。
網(wǎng)友們的看法:
“如果我們設(shè)計(jì)語言的特性時(shí),老把用戶看成是傻瓜,那是會(huì)出問題的。”Rob Van Dam
“自動(dòng)分號(hào)插入是JS最讓人頭疼的地方之一?!?fennec
10. Java:自動(dòng)裝箱(autoboxing)與Integer緩存
問題描述:
Java會(huì)自動(dòng)把基礎(chǔ)類型數(shù)據(jù)轉(zhuǎn)為對(duì)象(自動(dòng)裝箱),例如把int轉(zhuǎn)為一個(gè)Integer對(duì)象。同時(shí)默認(rèn)地,緩存Integer對(duì)象的取值為-128到127。這樣的話,在使用==來比較兩個(gè)相同取值Integer對(duì)象時(shí)會(huì)出現(xiàn)問題(在-128和127之內(nèi)是TRUE,其余的是FALSE)
成因分析:
自動(dòng)裝箱機(jī)制減少了代碼輸入量,同時(shí)Integer緩存提升了處理速度。
網(wǎng)友們的看法:
“還好我只是一名C#程序員?!?Will
“這不算什么錯(cuò)誤,反而給了我們一個(gè)使用原始類型(如:booleans)進(jìn)行數(shù)字處理的理由?!盧aviWallau
您可能感興趣的文章:- 8種類型極品程序員,不知你屬于哪一種?
- 關(guān)注程序員健康:程序最需要注意的幾件事