令程式設計師費解的10個語言特性
每種語言都有自己的獨到之處,或奇特的語法,或不常見的函式,或非標準的執行方式。因此,不論新丁還是老手,看著某個特性會突然醉了。文中總結了10個經常被提及的“奇異”特性。
1. Javascript: + 是一個連線符
問題描述:在JS中,+ 號用在數字間,可以用作常規加法;但如果遇上字元,又可作為字元連線符。例如:’1’+ 1的結果是11。
成因分析:
根本性原因是JS屬於弱型別語言。比方說Python,同樣地使用+ 號作為字元連線符,但由於它是強型別語言,一旦發現一個字元與一個整數進行相加,它會提示這是個錯誤操作。
網友們的看法:
“問題在於這是個無法預料的強制性靜默轉換,很容易就忽略了。”匿名
“JS應該就該情況作異常丟擲處理。” crgwbr
“用+來進行字元連線簡直是個噩夢。” Matteo Riva
2. Perl:模組必須返回TRUE值
問題描述:絕大多數情況下,Perl模組在結束時候,都必須以1;語句來結尾,否則,如果最後一條語句的返回值不是TRUE,系統就會報錯了。
成因分析:
Perl模組中包含了初始程式碼和子程式。當模組檔案被載入時,Perl會根據是否返回TRUE來判斷程式碼是否成功執行。即使沒有初始程式碼,Perl仍然期望最後的語句需返回TRUE,否則會報錯。
網友們的看法:
“這個通常讓我有不安的感覺。” Drew Hall
“這是最無實用價值的用法了。”Schwern
3. C/C++:三字母詞用法
問題描述:
舉例來說,系統看到??!會把它自動轉為|,看到??(會轉為[。這很容會引起造成意想不到的結果,並且會大大降低程式碼的可讀性。
成因分析:
早期進行程式設計時,鍵盤上還不能直接打出某些特殊字元,例如大括號。因此用了這種間接的方法。
網友們的看法:
“博學如谷歌,也一定看不懂什麼是??!??!” Isaac
“自1977年有了三字母詞,C就變得晦澀難懂了。”Martin Beckett
4. PHP:大小寫敏感處理
問題描述:
PHP對大小寫處理比較混亂,有些地方區分,有些地方不區分。例如:變數名,常量名區分;函式名,方法名,類名不區分。
成因分析:
很可能是PHP從CGI指令碼集發展成成熟程式語言過程中出現的人工產品。
網友們的看法:
“這是為什麼PHP程式設計師習慣用下劃線進行函式命名,而不是採取駝峰命名法的原因。”paperstreet7
“在PHP中,一切皆有可能!”Grzechooo
5. Ruby:0作為真值
問題描述:
在Ruby中,0值等同於TRUE值。這對有C,Python基礎的程式設計師來說不可不謂是一場噩夢。
成因分析:
只有布林值FALSE和nil等價於FALSE,其餘的都等同於TRUE。0與1,2,3等都會被相同對待。
網友們的看法:
“這簡直是讓人抓狂,雖然初衷是善意的。” Chris Lutz
“0==true!我這個C語言腦袋都快崩潰了!”Kenny
6. Python:以空格數進行層次劃分
問題描述:
不同於採用關鍵字或標點符,PY中採用縮排層級來進行層次劃分,以明確每一行程式碼的位置。不正確的空格數(或空格和換位符數不一致)都可能造成程式報錯。
成因分析:
PY作者的意圖是希望程式碼更為可讀,減少不必要的輸入,並希望程式設計師本身應該承擔起維護程式碼清晰度的責任。
網友們的看法:
“由衷地說,這是使我對PY敬而遠之的根本原因。”wazoox
“如果我們真的需要類似的強制機制,我們是不是真的太懶了!”Joris Meys
7. C:陣列索引工作模式等同於指標
問題描述:
在C中,a[i]和i[a]是可以互換的,兩個寫法都能得出一樣的結果。
成因分析:
在C中,對記憶體塊而言,陣列與指標是無差別的,就是說:
a[i] = *(a + i) = *(i + a) = i[a]。
網友們的看法:
“在C語言混亂程式碼比賽中,這毫無價值可言。”Confusion
“我想這正正揭露了C語言的核心,指標和更直接地與記憶體打交道。”Michael Neale
8. Perl’s:預定義變數
問題描述:
Perl有一份很長很長的特殊變數列表,裡面的名字都是十分繁雜的(儘管有對應的長英文單詞)。因此,除非是Perl資深開發人員,否則反覆翻閱Perl文件是常有的事。
成因分析:
這些變數都有不同的含義,例如:程式ID($$),錯誤資訊($@),正規表示式匹配($^R)。
網友們的看法:
“十分令人懊惱!”MatrixFrog
“對精簡型開發者可能是福音。”niXar
“這些變數的問題是:無法通過谷歌查詢得到!” malvim
9. JavaScript:自動分號插入
問題描述:
JS使用分號作為語句結束的標誌,並且會自行插入,即使是程式碼斷行的情況。因此會常常導致錯誤的出現。
成因分析:
自動化的本意是為了帶來便利,特別是對新手來說。
網友們的看法:
“如果我們設計語言的特性時,老把使用者看成是傻瓜,那是會出問題的。”Rob Van Dam
“自動分號插入是JS最讓人頭疼的地方之一。” fennec
10. Java:自動裝箱(autoboxing)與Integer快取
問題描述:
Java會自動把基礎型別資料轉為物件(自動裝箱),例如把int轉為一個Integer物件。同時預設地,快取Integer物件的取值為-128到127。這樣的話,在使用==來比較兩個相同取值Integer物件時會出現問題(在-128和127之內是TRUE,其餘的是FALSE)
成因分析:
自動裝箱機制減少了程式碼輸入量,同時Integer快取提升了處理速度。
網友們的看法:
“還好我只是一名C#程式設計師。” Will
“這不算什麼錯誤,反而給了我們一個使用原始型別(如:booleans)進行數字處理的理由。”RaviWallau
英文出自:ITworld
相關文章
- 每個程式設計師都應該知道的下一個程式語言——Kotlin程式設計師Kotlin
- 從程式語言排行看程式設計師信仰程式設計師
- 程式設計師必知的程式語言編年史程式設計師
- Java8 新特性 —— 函數語言程式設計Java函數程式設計
- 【ChatGPT】每個程式設計師百寶箱必備的語言模型ChatGPT程式設計師模型
- 2020年流行哪些程式語言?程式設計師的前景如何?程式設計師
- 軟體設計師:程式設計語言基礎知識程式設計
- 函數語言程式設計的幾個概念函數程式設計
- 高階程式設計師——java語言深度解析程式設計師Java
- PHP 程式設計師轉 Go 語言的經歷分享PHP程式設計師Go
- 程式設計師常用術語解釋程式設計師
- 用程式語言解密京東雲女程式設計師解密程式設計師
- 程式設計師的10個好習慣程式設計師
- 面向領域專家的語言,而不僅僅是程式設計師的語言程式設計師
- python函數語言程式設計詳解Python函數程式設計
- 初步瞭解C語言Windows程式設計C語言Windows程式設計
- JDK 8 新特性之函數語言程式設計 → Stream APIJDK函數程式設計API
- 使用C語言程式設計的7個步驟C語言程式設計
- ‘程式語言‘ ’程式設計工具’程式設計
- 程式語言設計,程式設計哲學程式設計
- 高階語言程式設計作業 10/12程式設計
- 程式設計師都不知道的5種將死的程式語言程式設計師
- Python 3.8與普通程式設計師有關的幾個新特性Python程式設計師
- 程式設計師簡歷探秘,java語言發展前景程式設計師Java
- 程式設計師為什麼討厭這些語言程式設計師
- 幽默:偏愛某種計算機語言的程式設計師簡稱計算機程式設計師
- 免費學習程式設計的10個好工具!程式設計
- 免費學習程式設計的10個好工具程式設計
- 3月程式語言排行及程式設計師工資,快看看你在哪個等級!程式設計師
- c語言程式設計題C語言程式設計
- 函數語言程式設計函數程式設計
- JAVA語言程式設計思想Java程式設計
- RAC的函數語言程式設計函數程式設計
- 為什麼改元“令和”,竟然成了日本程式設計師的魔咒?程式設計師
- 程式設計師需要了解的10個Linux命令程式設計師Linux
- Scala 函數語言程式設計(一) 什麼是函數語言程式設計?函數程式設計
- 程式設計師節只有程式設計師才能看懂的祝福語程式設計師
- 解決問題的能力 > 10倍程式設計師程式設計師
- Go 語言的 4 個特性改動Go