x数组的起始下标为什么为0?

相信每一位初学者都曾吐槽过 C 语言的数组下标为什么从 0 开始,而不是从 1 开始,这样太不人性化了😄 。实际上,不仅是 C 语言,其他绝大多数语言的数组下标也是从 0 开始的,既然都如此设计,就必然有它的好处。下面我们就这个问题来进行粗略的讨论。

  • 首要目标:为了方便计算出每个元素的具体内存地址:
    a[0] 的内存地址 = a的地址 + 0 * 4 (第一个元素的地址计算结果跟数组的首地址一样)
    a[1] 的内存地址 = a的地址 + 1 * 4 (下标是1,内存地址就就是首地址偏移 4 字节)
    a[2] 的内存地址 = a的地址 + 2 * 4 (下标是2,内存地址就首地址偏移 8 字节)

    a[5]的内存地址 = a的地址 + 5 * 4 (下标是5 内存地址就是首地址 偏移 20字节)
    如果从 1 开始,每一步都要减去1,多一步运算,效率就相对较低;而从 0 开始,就无需减 1。

  • 利于边界处理: 下面这张图胜过千言万语

    将一个左闭右开区间“切割”时,其子区间也能很好的符合左闭右开的形式。例如:区间[x,y)可以分割为:[x,z)和[z,y)——无缝连接,没有重叠。假如是全闭区间的话,边界情况处理起来就比较麻烦。全开区间的话会丢掉端点,边界情况就要特判。

  • 数组[1,3,4,7,8]的中间下标为 5/2 = 2,刚好在中间,对应数字为4;如果下标从 1 开始,那么下标 2 就对应数字3,实际并不是数组的中间位置。

  • 有点植树问题的感觉,比如你要爬到第 15 楼,而实际上只需要爬 14 层;如果将第一层定义为 0 层,那么你去第 15 楼时,实际也只需要爬 15 楼;这使得描述更加统一。

你还有其他见解吗?欢迎在评论区提出。

文章作者: 极简
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 后端技术分享
C/C++
喜欢就支持一下吧