為什麼編程語言中的區間一般是 [begin, end)?
01-07
而不是 [begin, end] ?純粹是因為下標從0開始的原因嗎?
我問了個蠢問題 OTL ,參見相關問題 為什麼有些編程語言的數組要從零開始算?
老問題了。
Edsger W. Dijkstra 在他的手稿 E.W. Dijkstra Archive: Why numbering should start at zero (EWD 831) 中就解釋了為什麼這樣做比較好。舉例來說,表示 2,3,...,12 這一串自然數有以下四種方法:
1.
這四種表示方法中,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:編程語言 |
