程序員喜歡從0開始計數,那為什麼程序的行號都是從1開始?


程序員從0開始計數是因為這裡的0代表的是數組首地址偏移量。也就是說 arr[0] 和 *(arr+0)等價。反映到具體的代碼上就變成了從0開始數數。因為這個模式用的太多了,就成了一個梗。

然而一般情況下行號不是偏移量啊(╯°□°)╯︵ ┻━┻

不信你把vim的行號調到偏移量模式看看是不是從0開始。


確實是馮昱堯說的原因,C語言里0做下標的原因是下標就是偏移量。C暴露了很多內存管理的細節,你可以把數組轉換為指針,你也可以對著任何一個指針進行下標運算和加法運算……而且它們有等價性(*(p+5)和p[5]意思是一樣的,所以p[0]的意思必須跟*(p+0)一樣),雖然如果這個指針不是從數組變來的就undefined behavior了……好吧,總之,那麼數組最前面的元素如果下標不稱作0,這一切都會在邏輯上無法自恰。

Pascal就無所謂,因為Pascal的內存模型不會暴露那麼多實現細節,所以下標可以不是偏移量,也就沒有必要從0開始了。

大體思路是這樣,然後跟C可以互相操作的語言(python, c++, go, rust, 好吧,就是幾乎所有的語言……)為了跟C兼容,即使自己並不暴露實現細節也會選擇以0為下標起點。同樣,繼承C語法的語言(java, javascript, C#)也不會故意去給人製造混淆,所以也會選擇以0為下標起點。

而如果跟C完全不需要互相兼容(比如顯示個行號),那麼當然還是怎麼直觀怎麼來。


不妨把這兩種計數方式分別稱為:

自然計數法(從1開始)

定址計數法(從0開始)

這個定址計數法主要是在彙編裡面,數組的編號,正好就是數組第一個元素的地址。所以如果你要取出數組的第一個元素,那麼就是取出從數組編號開始,向後偏移0個元素長度的距離,這個位置所存儲的數據。

所以第二個元素,就是要跳過第一個元素的空間咯,向後偏移一個元素的距離即可。

完事了Ken教授在貝爾實驗室開發C的時候主要是面向工程的,所以從彙編中集成了非常多的語法糖,數組的下標訪問就是一例。

不得不承認,C的影響力是巨大的,這種寫法後來就成了一種傳統,一直就穿了下來。

所以說,從0開始說的是跳過0個元素的距離,指向第一個元素。

文件1開始,說的是從無到有。之前這個文件沒有內容,寫上點什麼東西就變成有內容了。符合人類一般認知。

當然這樣的差別會製造麻煩。比如每次我開發什麼東西給別人用的時候,都要考慮訪問容器時的下標問題。

一開始,我認為從0開始是合適的,畢竟會用我的庫了,我默認你是有計算機科學的一般常識了。

直到我見識到電子行業一茬又一茬小鮮肉,甚至是入行多年的同行,前輩,他們的計算機水平之後,我的內心是崩潰的……

容器的下標,確實是一個問題……

每當他們問我為什麼對容器的訪問為什麼返回錯誤結果/報告越界,我的內心是日了狗的。

後來我就把容器實際訪問地址,改為參數減1了。

煩躁,這些人就不能專業一點嗎?


那是因為你用的是文本編輯器,而文本編輯器用的是一般人的慣例,即從1開始計數。

你要是把程序當成文件,然後寫另一個程序去按行處理,那還是從0開始計數:

lines = open("program.c").readlines
puts lines[0] # 第一行


如果有一天你費勁千辛萬苦,把一大段程序用函數編程的思想重構成一行

然後你和領導說「今天我寫了零行代碼」,這樣好么...

我這不是抖機靈

程序員並不喜歡0,用0是因為那個場景下表示的是偏移量

數數的時候,還是從1的開始的哦


因為內存的第一個地址是0


萬一產品經理腦子一熱要看代碼呢?


從零開始是為了節約空間。


不是程序員喜歡,是程序喜歡


彙編的行號我記得是從零開始,還有更老的Pascal和basic貌似也是。


編程語言大多都是從0開始數數,但也有少部分是從1 開始數的。

這個真的不是我們想從0開始數,而是這個語言規定了是從0開始,理由如其他人所講的


沒有誰會喜歡從0開始計數,這是反人類的設計,但這是早期的語言設計者挖的坑,後面也就只能這樣了。


從0開始計數是代表的計算機,行號從1開始才是代表的人類。


個人感覺並不是所有程序員都喜歡從0開始計數,比如我。


推薦閱讀:

為什麼用 EmEditor 的人不多?
Markdown中插入圖片有什麼技巧?
Sublime text 和 vim 有什麼功能是用 UltraEdit 無法實現的?
為什麼知乎不支持MarkDown?
怎麼做像知乎這樣的一個文本框編輯器的呢?

TAG:文本編輯器 | 程序員 | 計算機 | 程序 | CC |