这个竟然是很有道理的事情. 大牛dijkstra(弄过tsp的都知道吧)有一篇论文写了这个事情: https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

先解释了一下数组范围这个是咋搞的. 一般有四个:
  1. 2<=i<13
  2. 1<i<=12
  3. 2<=i<=12
  4. 1<i<13
  • 首先说, 虽然3看上去很对称, 但是他第一个被淘汰, 因为如果没有可选内容的时候, 他表现不出来, 或者说, 他很难正常表现出来, 正常情况这个式子的i至少会选中一个元素.
  • 如果是循环处理一个长的数组/字符串, 那么只有1和2是可以顺序处理的. 因为他的上下界的差刚好等于截取的长度, 也就是说第一个序列的上界等于第二个序列的下界.
  • 不过如果我们从0开始选择, 那么左半个式子下界会变成-1<i, 这个不直观了. 因此 0<=i.
  • 单独考虑右半个式子(也就是上界), 如果起点为0, 宽度为1时, i<=0, 宽度缩为0时, i<=-1, 这个很奇怪了. 因此i<0

由此, 大部分的语言的数组/字符串切割都是格式1, 0<=i<0 这就是0开始的空字符串

那么为啥index从0开始呢
  • 这是因为, 如果从零开始, 那么我们截取前面n个元素, 就可以直接用i<n来表示.
  • 相反, 如果从1开始, 我们截取的时候还要i<n+1.
  • 并且从头开始的比较一个是0<=i, 另一个是1<=i,
  • 显然后一个判断要进行一次减法, 而前一个判断可以直接判断.
以coffee举例
# 表示1-10的十个数字
[1...11] #11-1=10, 长度是10个数字
[1..10]
# 如果是0到9
[...10] # 这个真的更合理, 因为0-9是10个数字, 不是9个数字.
[..9]