Arrays 什么';以非零索引开始的数组的用途是什么?

Arrays 什么';以非零索引开始的数组的用途是什么?,arrays,programming-languages,Arrays,Programming Languages,我试图找到答案,但我得到的只是关于如何实现从非零索引开始的数组的答案。某些语言(如pascal)默认提供此功能,例如,您可以创建一个数组,如 var foobar: array[1..10] of string; 我一直在想:为什么要让数组索引不以0开头 我想初学者可能更熟悉数组以1开头,最后一个索引是数组的大小,但从长远来看,程序员应该习惯以0开头的值 我可以想到的另一个用途是:在某些情况下,索引实际上可以表示各个数组项中包含的内容。e、 例如,如果要获取数组中的所有大写字母,可以方便地使用

我试图找到答案,但我得到的只是关于如何实现从非零索引开始的数组的答案。某些语言(如pascal)默认提供此功能,例如,您可以创建一个数组,如

var foobar: array[1..10] of string;
我一直在想:为什么要让数组索引不以0开头

我想初学者可能更熟悉数组以1开头,最后一个索引是数组的大小,但从长远来看,程序员应该习惯以0开头的值

我可以想到的另一个用途是:在某些情况下,索引实际上可以表示各个数组项中包含的内容。e、 例如,如果要获取数组中的所有大写字母,可以方便地使用索引作为各个字母的ASCII码。但是减去一个常量是很容易的。在本例中,您可以(在C中)简单地执行以下操作,即获取所有大写字母并使用ascii代码67访问字母:

#define ASCII_SHIFT 65
main()
{
    int capital_letters[26];
    int i;
    for (i=0; i<26; i++){
        capital_letters[i] = i+ASCII_SHIFT;
    }   
    printf("%c\n", capital_letters[67-ASCII_SHIFT]);
}
#定义ASCII_移位65
main()
{
国际大写字母[26];
int i;

对于(i=0;i如果您的索引表示某个内容,例如来自数据库的id或类似的内容,那么它很有用

哦,您不能使用哈希,因为您希望将它与其他需要数组的代码一起使用


例如,Rails复选框。它们作为数组从web表单传递,但在我的代码中,我想访问UdnerLiving数据库对象。数组索引是id,等等!

如果您的索引表示某个内容,例如来自数据库的id或类似内容,那么它很有用

哦,您不能使用哈希,因为您希望将它与其他需要数组的代码一起使用


例如,Rails复选框。它们作为数组从web表单传递,但在我的代码中,我希望访问UdnerLiing数据库对象。数组索引是id,等等!非零基数组是数组的自然扩展,具有非整数的顺序索引。在Pascal中,可以有如下数组:

var
  letter_count : array['a'..'z'] of integer;
或:

经典的是具有负索引的数组:

zero_centered_grid = array[-N..N,-N..N] of sometype;
其想法是:

  • 如果索引的声明更具体,则在编译时可以检测到许多索引错误
  • 当最小索引不同于零时,一些算法(我想到的是堆)有更干净的实现

只有零基数组的语言对后者使用定义良好的习惯用法,其余语言则使用高效的字典/映射实现。

非零基数组是非整数有序索引数组的自然扩展。在Pascal中,可以使用如下数组:

var
  letter_count : array['a'..'z'] of integer;
或:

经典的是具有负索引的数组:

zero_centered_grid = array[-N..N,-N..N] of sometype;
其想法是:

  • 如果索引的声明更具体,则在编译时可以检测到许多索引错误
  • 当最小索引不同于零时,一些算法(我想到的是堆)有更干净的实现

只有零基数组的语言对后者使用定义良好的习惯用法,其余部分则使用高效的字典/映射实现。

正如您所猜测的,我也认为这是为了让初学者更容易理解数组。俗话说:“你从未拥有过的,你永远不会错过”.基于非零的索引有很多用途(它们不只是“初学者”)C是一种低级语言,它的设计效率很高,因此限制了基于0的数组索引。高级语言不必担心这个约束。如果你真的想对某事物有所了解,那么请考虑一下Matlab只支持基于1的数组索引的事实。ays值得回答:它可以用机器代码完成。正如你所猜测的,我也认为这是为了让数组更容易被初学者理解。俗话说:“你从未拥有过的,你永远不会错过”。非零基索引有很多用途(它们不只是“初学者”)C是一种低级语言,它的设计效率很高,因此限制了基于0的数组索引。高级语言不必担心这个约束。如果你真的想对某事物有所了解,那么请考虑一下Matlab只支持基于1的数组索引的事实。答案是:这一切都可以在机器代码中完成。