原文:Why numbering should start at zero by Edsger Dijkstra
表示自然数2,3,...,12的数列时中间三个点实在是碍眼,我们应该可以想到四种表记文法拿掉它们:
a) 2 ≤ i < 13
b) 1 < i ≤ 12
c) 2 ≤ i ≤ 12
d) 1 < i < 13
是否有理由认为其中一种是最优雅的呢?是的,确实有。考察a)和b)发现它们具有以下优点:边界之间的差正好等于所提及的数列的长度,这一结果是有说服力的。因此,考察结论是,在任一文法中,两个数列相邻意味着一个数列的上限等于另一个的下限。由于这些考察是有说服力的,她们让我们无法在a)与b)之间作出选择;故而我们换一种方法。现在考虑从最小
假设有一个最小自然数。像b)和d)那样排除下界的做法迫使一个从最小自然数开始数列如前所述的下界被挤到非自然数范围里。那相当不雅观,所以在下界的处理上,我们更希望是a)和c)里的≤的做法。现在考虑从最小自然数开始的数列:在数组收束为空数组,包含上界让下界的存在变得多余尴尬。那相当不雅观,所以在上界的处理上,我们更希望是a)和d)里的做法。我们的结论是a)最受青睐。
备注 产生于Xerox PARC的编程语言Mesa对所有四种文法都有特定记号表示。Mesa程序员的大量经验已经表明另外三种文法的用法一直是苦手和错误的根源,出于这种体会,Mesa程序员现在强烈建议不要使用后三个功能。我曾今提到这个实验证明—她价值何在—因为有些人对在实践中尚未得到证实的结论感到纠结。(备注结束)
处理长度为N的数列时,我们希望通过下标区分其中的元素,下面烦人的问题是分配给她起始元素的下标值。按照文法a),假如下标从1开始,其取值范围是1 ≤ i < N+1;然而下标从0开始给出了更为优雅的取值范围0 ≤ i < N。因此我们可以让所有的序号从0开始:一个元素的序号(下标)等于同序列中她前面的元素数。这个论述的意义在于我们应该将0视为最自然的数字—有生之年。
备注 许多编程语言没有对此细节予以足够的重视。在FORTRAN中下标一直是从1开始的;在ALGOL 60和PASCAL中,它们都采用了文法c);最近的SASL已经回到了FORTRAN文法的怀抱:事实上,SASL中的序列同时也是正整数上的功能。好可怜啊!(备注结束)