java - 为什么数组的索引/列表不以 1 开头?

标签 java c++ python c coding-style

<分区>

有什么特别的原因吗?我知道语言就是这样写的,但我们不能改变它吗? 如果索引从 1 开始,我们将面临哪些挑战?

最佳答案

出于历史原因,以及与数组在内存中“制作”的方式相关的原因。

在 C 中,数组是一 block 内存(在编译器级别有一些关于其大小的信息)。您有一个指向其第一个元素的指针(引用)。要转到它的第二个元素,你可以这样做

int array[10]; // your array

int *p = array; // reference to first element of array
int *q = p + 1; // reference to second element of array 
int *r = p + 2; // reference to third element of array 

显然,为了对称:

array[0] // reference to first element of array
array[1] // reference to second element of array
array[2] // reference to third element of array

C 的[x] 运算符实际上被编译为array + x

你看到了吗?数组在 C 中是“以 0 为基数”。由于这个原因,在许多其他语言中也是如此。

现在,C++ 的根源是 C,Java 的根源是 C++ 和其他语言,C# 的根源是 C++、java 和其他语言……同一棵树。

Basic 显然是另一棵树:-)

关于java - 为什么数组的索引/列表不以 1 开头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18109671/

相关文章:

java - Hibernate 自引用父子

c++ - Windows编程对话框背景图片

python - 最小化大量变量

python - Django Admin - 不显示状态表显示 "resolved"的结果

java - 接缝测试 NoSuchMethodError

java - 用于从 Java 生成 excel 文件的 jxlapi 中的列限制

java - 如何优化从平面文件到 BD PostgreSQL 的数据导入?

C++ 奇怪的 RAW 套接字和 iptables 问题

c++ - 多个定义的符号 C++ 错误

python - 如何使用 ctypes 加载链接到非默认 libc 的库?