其他答案也说的很多了,大致是从 0 开始对机器友好,从 1 开始对人友好。
不过我想找点有意思的,比如:世界上第一门高级语言属于哪个流派?从数组定义以及默认的下标起始值两个方面看,可以把编程语言分为三个流派:流派1:数组定义时指定数组长度,默认下标从 0 开始。例如 int v[10],定义了 10 个元素的数组,下标范围 0 到 9
流派2:数组定义时指定数组最大下标,默认下标从 0 开始。例如 int v[10],定义了 11 个元素的数组,下标范围 0 到 10
流派3:默认下标从 1 开始(这时数组最大下标就是数组长度了)
那么首先要解决的问题是……第一门高级语言是谁❕
好吧我没听过。去看一下它的语法,使用的还是数学符号语言。现在来看还真鸡儿奇怪…
这张表定义了三个变量:第一个变量是 Z0,它的类型是 0(即1 个 bit);第二个变量是 V1,它的类型是一个两个元素的 Tuple,每个 Tuple 的类型是某个类型 σ;第三个变量是 Z1,它的类型是一个四个元素的数组,数组每个元素是一个 bit。至于遍历嘛,要这样:
i 的值是从 0 到 n,这样数组下标就是从 0 开始了。这么看来, Plankalkül 属于流派 1。
那数组下标从 1 开始又是哪门语言开始的?我去考了一下古,这是 50 年代以后诞生的主要语言
已知较早的数组下标从 1 开始的语言包括 FORTRAN、ALGOL 68 和 COBOL
不算汇编语言,第一个是 Autocode。它有好多个版本,最初的 Mark 1 Autocode 并没有数组的概念。后来的 50 年代中期的 Mercy Autocode,它的数组是从 0 开始的
v' -> 180
which defined an array v'(0) to v'(180).
而且……震惊!它居然是第二个流派的!!Mercy Autocode 还是后来 1964 年出现的 Dartmouth BASIC 语言的前身,这就无怪乎很多 Basic 方言都是第二个流派了。Dartmouth Basic 就是最古老的 Basic 语言,它的第一个版本的索引其实是从 1 开始的,从第二个版本开始才支持从 0 开始的索引,理由是在表达多项式上更方便。
第二个 IPL,看起来是没有独立的数组概念,但它对于一个 List 的第一个元素使用 L0 指代
第三个 FLOW-MATIC,则是第一个使用英语描述的编程语言(之前都是使用符号语言)。它的创造者 Hopper 就是那个在机器里真的抓到了一只虫子的那个人❕(还是一位女性)。这个语言也没有数组的概念,但是它在对文件格式的定义上,所有的范围都是从 0 开始
再下面是跟 FORTRAN 同年 COMTRAN 了。作为 COBOL 的几门前辈语言之一,它对 table 或者 list 的索引是从 1 开始的
COMTRAN(包括 COBOL)都是直接面向 Business Programming 的。想想以前那么多纸质的文件,页码、表格行什么的都是从 1 开始,也可以理解为什么它们选择从 1 开始的索引了。
COMTRAN 跟 FORTRAN 同年诞生。但 FORTRAN 从 1954 年就开始设计
参考