標籤:

為什麼編程語言中的區間一般是 [begin, end)?

而不是 [begin, end] ?純粹是因為下標從0開始的原因嗎?

我問了個蠢問題 OTL ,參見相關問題 為什麼有些編程語言的數組要從零開始算?


老問題了。

Edsger W. Dijkstra 在他的手稿 E.W. Dijkstra Archive: Why numbering should start at zero (EWD 831) 中就解釋了為什麼這樣做比較好。

舉例來說,表示 2,3,...,12 這一串自然數有以下四種方法:

1. 2 leq i < 13

2. 1 < i le 12

3. 2 le i le 12

4. 1 < i <13

這四種表示方法中,1 和 2 兩種方法要好於 3 和 4。 因為:

1. 前兩種方法的上下邊界之差正好等於這個數列元素的個數 (13 - 2 = 12 - 1 = 11)。

2. 表示兩個相鄰的數列時,前一個數列的上邊界與後一個邊界的下邊界相等 ([2,13) 與 [13,15) 相鄰)。

那 1 和 2 兩種方法之間有沒有優劣之分呢?

答案是有的,如果採用第二種方法,那在表示自然數時會不自然起來,因為最小的自然數是零,要表示從零開始的數,下邊界的數就得是-1,(-1,5] 與第一種方法的 [0,6) 相比,高下立判。

所以大家都常用第一種表示方式。

考慮到有些人可能覺得這種空談優劣的討論有點想當然,Dijkstra 在手稿後面還補充道:

當年 Xerox PARC 開發的語言 Mesa 中,上述四種表示方法全部都有。結果,大量實際經驗表明,用後三種表示方法常常會導致各種低級錯誤。以致於後來的 Mesa 開發者們被強烈建議不要使用後三種表示方法。

附上手稿PDF版:https://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF


感覺為什麼有些編程語言的數組要從零開始算?第一名的答案可以回答這個。。。


其實還有一個很方便的地方

你看你有一個區間[l,r]

我現在要把它分成兩個,那就是

[l,mid]

[mid+1,r]

這+1是要鬧那樣啊!

如果用左閉右開就只要最開始用[l,length)之後就是

[l,mid)

[mid,r)

不過如果是二分的話我會用左閉右閉的原因同上。


湊個熱鬧。

Why does range(start, end) not include end?

這裡邊,提到:

Exclusive ranges do have some benefits:

For one thing each item in range(0,n) is a valid index for lists of length n.

Also range(0,n) has a length of n, not n+1 which an inclusive range would.


我的經驗是如果寫成

for(int i = 0; i {

}

你會習慣性地知道循環了N次,並且第一個索引值是0。

如果是


推薦閱讀:

MATLAB有什麼突出優勢和劣勢?
請問學習網頁製作,需要學習什麼呢?
可不可以跳過彙編,直接學習SWIFT語言?
同時學習多門編程語言是否會降低學習效率?
學習多門編程語言有哪些好處?

TAG:編程語言 |