為什麼ColdFusion的設計者決定從1而不是0索引數組?


Answers

有兩個約定,一個是大多數編程語言通用的約定,一個是大多數非編程人員通用的約定。 他們可能是瞄準那些不以0開始計數的人。

Question

我只是好奇這件事,有誰知道他們為什麼打破了這個規定?

謝謝,Ciaran




也許這不只是一個外行的東西......我認為,大多數接近任何網絡語言的人至少已經擺弄了javascript(10年前也是如此)。 基於0的索引不是那麼的陌生。

我喜歡關於在1開始索引/位置(對於字符串)的語言的事情是,你可以做類似的事情

<cfif find("c","cat")>

如果找到了c,那麼它的計算結果為true ,而且會是。

而像JavaScript這樣的基於0的語言

if ("cat".indexOf("c")) { 

評價為false ,所以你需要說一些像if ("cat".indexOf("c") >= 0) {

但是,語言之間的轉換是一個不容忽視的小問題,因為忘記這樣做,或者忘記修改數組可能會導致數據轉換失敗,並且兩種風格之間的轉換可能會導致失敗。

我想,如果Allaire知道Web最終會在哪裡,客戶端和服務器如何真正協同工作,那麼我們就會有基於0的索引。




數組的起點沒有約定。 例如,大多數基礎都從1開始。 有些語言可以讓你在任何你喜歡的地方啟動數組,或者讓數組索引為枚舉等(例如Ada)。 C使用了0刺的概念,許多語言都遵循,但並不是全部都遵循。 他們不這樣做的一個原因是從1開始的數組更直觀。




作為一個不同的旋轉,讓我們問一下為什麼在某些語言中數組索引從零開始? 對於離散對象(如數組元素)的計數,這是沒有意義的,從人的角度來看是不自然的。

這最初似乎源於C這樣的語言(儘管我並不是說它首先出現在C語言中:我不知道,而且這對於語言及其編程而言是相當緊密的)加上內存管理( malloc等)。 一些C語言與地圖上的內容非常接近。 變量就是這樣一個例子:除了變量名,我們總是用變量在指針等變量所在的內存地址忙著自己。

所以我們來到C中的數組,並且這些索引的方式是存在於內存中的一系列元素,從數組變量的基本內存位置開始,每個元素被數據類型的大小偏移(例如:一個字符是一個字節等)。 所以要在內存中查找數組中的每個元素,我們這樣做:

arrayBaseAddress + (whichElementItIsInTheArray * sizeOfDataType)

而在C裡做事情的時候,其實真的會發現自己這樣想,因為它比較接近於計算機必須做的事情,以找到代碼所需的價值。

所以whichElementItIsInTheArray被用來抵消內存地址(以sizeOfDataType為單位)。

顯然,如果一個數組的索引從1開始,它將在內存中被一個sizeOfDataType所偏移,所有意圖和目的在arrayBaseAddress和第一個元素實際所在的位置之間浪費了一個sizeOfDataType的內存量。

人們可能會認為這並不重要,但在過去的日子裡,當所有這些都被執行的時候,記憶就像金子一樣:不能像這樣浪費。 所以人們可能會認為“好吧,只要whichElementItIsInTheArray它放在引擎蓋下,就把它whichElementItIsInTheArray在-1之下”,但是就像記憶一樣,時鐘週期是金的,所以不是浪費處理,而是程序員只需要使用以不自然的方式計數。

所以在這種情況下,有一個合理的原因是在索引0處啟動數組。

在我看來(現在已經進入了編輯傾向),當後來的“花括號”語言出現時(比如Java),他們僅僅依靠它是否真的相關,因為“就是這樣做”。 而不是“這種方式是有道理的”。

另一方面,更多的現代語言,以及更多從計算機的內部運行中去除的語言,有人停下來思考“我們為什麼要這樣做?”,並且“在這種語言及其預期用途的背景下,這是否使感?”。 我在這裡答复的答案是肯定的 - “不”。 在很多情況下,將數組索引偏移-1的資源浪費或簡單地忽略第零個元素的內存不再是相關的考慮因素。 那麼為什麼要讓語言和程序員必須抵消他們自然而然地統計事物的方式,純粹是遺留的原因呢? 沒有合理的理由這樣做。

在C中,有一個數組a[0]的元素。 這是數組的第一個元素(不是“第零個”元素),如果這是數組的全部範圍,則它的長度是1 。 所以這裡的特質行為是編程語言的一部分,而不是在現實生活中(這是我們大多數人所居住的地方)計數/列舉的方式的一部分。 那麼為什麼堅持下去呢?

這裡有些人反駁說:“我們出生的時候,我們不是一個,我們是零”,這個“從哪裡開始索引”的論點。 這是事實,但這是一個連續的事情,而且是不一樣的。 所以與交談無關。 一個數組是離散項目的集合,當測量離散項目的數量時(即:對它們進行計數),我們從一開始。

這是如何增加對話? 那麼它不是很多,但它是一個不同的方式看待同樣的事情。 我想這對於這個概念有點合理化/反應,有些人認為從1開始的數組索引是“錯誤的”。 從人的角度來看,這並不是錯的,而是從零開始。 所以讓人類像人類一樣寫代碼,並讓機器根據需要去理解它。 基本上這只是對傳統技術的限制,我們從一開始就把它們從零開始計算在內,如果我們不再需要的話,就沒有必要延續這種做法。

所有的“國際海事組織”,當然。




那麼,除非我們有任何的原創設計師,否則任何事情都會變得艱難,只是猜測而已。 但是在前世使用過CF,我有一些想法。

如果你看一下原來的語言,它是為那些想要構建動態應用程序而又沒有太多複雜性的人設計的。 我還記得他們最終發布用戶定義函數時的喜悅,所以我不必在任何地方使用標籤。

在此基礎上,那麼人們不得不面對的語言 - 比如數組 - 就會變得更“友善”。 對我來說,看陣列[0]是非常有意義的。 但是對於那些還沒有學習過的範式的人來說,這是沒有任何意義的。 我為什麼要訪問位置為“0”的對象?

有趣的是,現在CF在後端是Java,實際上你必須處理索引從1開始的情況,以及從0開始的情況。所以通過嘗試有幫助,他們實際上增加了更多的複雜性語言已經成長。