是否存在其他具有非零索引数组位置的常见“ C类”或非“ C类”语言?[关闭]


76

C编程语言被称为零索引数组语言。使用可以访问数组中的第一项0。例如double arr[2] = {1.5,2.5},数组中的第一项arr位于位置0。arr[0] === 1.5基于1的索引是什么编程语言?

我听说过这些语言从1而不是0开始进行数组访问:Algol,Matlab,Action!,Pascal,Fortran和Cobol。完成了吗

具体来说,基于1的数组将使用1(而不是0)访问第一项。


8
这应该是Wiki
Austin Salonen

48
人们为什么投票赞成“不是一个真正的问题”?显然,这是一个真实的问题。它可能不是网站上见过的最好的网站,它可能值得一看,但绝对不是因为它“不是一个真正的问题”。
克里斯·卢兹

2
几乎所有来自C之前的东西,因为整个零索引的东西都是作为组装/ C实现工件开始的(因为真实的人并不从零开始计数)。因此,Basic,COBOL,Fortran和它们衍生的大多数语言都可以使用。
RBarryYoung

1
我猜标题的格式不正确,但正文肯定是这样。这怎么不是一个真正的问题?
萨曼莎·布兰纳姆

7
克里斯·卢兹(Chris Lutz):RE:苦涩;还不算太苦,尤其要说“胡思乱想”。w /本网站上的闭幕投票。RE:“程序设计的食物”;您知道我用这个名字来开个玩笑,但实际上这是一个已经开放了一年的话题,几乎是一个话题:stackoverflow.com/questions/92257/programmers-food。这就是我disgruntles,此时此地靠近投票有没有做真正的编程问题和一切做与由本网站娇宠一定程序员的亚文化。狭culture的和近距离的亚文化。
RBarryYoung

Answers:


63

可以在Wikipedia上找到列表。

ALGOL 68
APL
AWK
CFML
COBOL
Fortran
FoxPro
Julia
Lua
Mathematica
MATLAB
PL/I
Ring
RPG
Sass
Smalltalk
Wolfram Language
XPath/XQuery

10
维基百科上的某些内容不完全正确吗?这么说吧!
davr

3
请注意,它说的是“默认基本索引”,因此该部分是正确的。但是,不正确的是BASIC中的默认基本索引仍然是0,而不是1-因此我将其修复。
帕维尔·米纳夫09年

5
实际上,BASIC的变化很大,尤其是在这一点上。
RBarryYoung

9
@Yannick:您知道维基百科可以被任何人编辑,对吗?为什么抱怨不正确;只是纠正他们!
不满的山羊

3
@ ST3可能就是它的幕后工作方式,但是PHP仍然将它们称为数组,并且它们的基本行为(使用它们而不指定键)就像数组一样。
Tynach

20

Fortran从1开始。我知道,因为我父亲在我出生之前曾经对Fortran进行编程(现在我33岁),他确实批评现代编程语言从0开始,说这是不自然的,不是人类的思维方式,与数学不同,并且以此类推。

但是,我发现从0开始的事情很自然。我的第一种真正的编程语言是C,如果n不能从零开始,**(ptr + n)的表现就不会那么好!


12
+1:但这确实是给您父亲的,与我差不多同时开始使用Fortran进行编程。我希望他教您数数时,他教您的东西像1头母牛,2头母牛,3头母牛。
高性能Mark

6
@High Performance Mark当然,奶牛是不自然的。他们应该从0头母牛开始。
亚伯2010年

3
计算项目时,甚至C程序员都不会说有0个项目(如果有1个项目的话)!但是第一项仍然可以有效地位于索引0。

11
等等,这是否意味着您在撰写本文时是33岁还是34岁?
亚历克·雅各布森

8
33岁,这是他的第34年
Jason S

14

维基百科上“数组系统交叉引用列表”表(“默认基本索引”列)下“比较编程语言(数组) ”中列出了大量语言。

有1对的订阅一般商量好了0-索引,

引用博客:

EW Dijkstra的EWD831,1982年。

当处理长度为N的序列时,我们希望通过下标区分元素,下一个令人烦恼的问题是将哪个下标值分配给其起始元素。遵守约定a)从下标1开始产生下标范围1≤i <N + 1; 但是,从0开始,给出的范围更好0≤i <N。因此,让我们使序数从零开始:元素的序数(下标)等于序列中位于其前的元素数。这个故事的寓意是,在所有这些世纪之后,我们最好将零视为最自然的数字。

备注::设计了许多编程语言,而没有对此细节给予足够的重视。在FORTRAN中,下标始终从1开始;下标始终从1开始。在ALGOL 60和PASCAL中,采用了惯例c);最近的SASL不再使用FORTRAN约定:SASL中的序列同时是正整数的函数。可怜!(备注结束。)


4
许多非CS工程师会(也确实)不同意Dijkstra的一些观点,因为在远离键盘的数学中,数学1仍然是数组的“默认”第一个元素。
Rook

另外,在FORTRAN数组下标并不总是从1开始
鲁克

11
Dijkstra当然提出了非常偏颇的看法。考虑到大多数人会将基于1的数组的范围描述为“ 1≤i≤N”,这比“ 0≤i≤N-1”好得多。
RBarryYoung

是的,Dijkstra的观点非常有偏见,并且,除了假设一种与当今人们如何编码方式不同的范例外,如今,即使基于for-in,反对基于1的索引的争论也比过去少得多。
拉马吉登(Llamageddon)


11

您可以在Perl中完成

$[ = 1;  # set the base array index to 1

如果您愿意,也可以从42开始。这也会影响字符串索引。

强烈建议不要使用此功能。


11

同样在Ada中,您可以根据需要定义数组索引:

A : array(-5..5) of Integer;       -- defines an array with 11 elements
B : array(-1..1, -1..1) of Float;  -- defines a 3x3 matrix

有人可能会辩称,用户定义的数组索引范围将导致维护问题。但是,以不依赖于数组索引的方式编写Ada代码是正常的。为此,该语言提供了元素属性,将为所有定义的类型自动定义元素属性:

A'first   -- this has the value -5
A'last    -- this has the value +5
A'range   -- returns the range -5..+5 which can be used e.g. in for loops

7

JDBC(不是语言,而是API)

String x = resultSet.getString(1);  // the first column

7
+1简直是疯狂,每次Java都会使我感到困惑,因为Java中的其他所有内容都是基于零的!
阿德里安·史密斯

2
这可能是因为SQL还使用基于1的索引,例如ORDER BY 1(第一列)或SUBSTRING(name, 2)(从第二个字符开始)
Alex Jasmin 2010年

请注意,Hibernate是Java上流行的ORM,通常位于JDBC之上,它具有setString方法,其中索引基于0。令人困惑。
Thilo 2010年


5

Lua-令人失望


2
lua从1开始的索引有什么问题?我使它对初学者编程更加友好。
RCIX


4

VB Classic,至少通过

Option Base 1

基数1?请不要,一元

VB.NET以及Dim x(10)创建11个元素的唯一语言……
Josh Lee 2010年

@jleedev:不完全是-VB.NET数组是0基于-的,数字声明了上限(有效索引范围是从010)。由于VB的For循环包含在内,因此非常适合。
达里奥

4

Delphi中的字符串从1开始。

(静态数组必须具有明确指定的下限。动态数组始终从0开始。)



3

艾达(Ada)和帕斯卡(Pascal)。


我不认为应该包含Pascal,因为根据所查看的内容,它同时使用0和1。字符串是1,但阵列是0。
汤姆甲

1
已经有一段时间了,但是我相信您可以使用任何喜欢的索引作为Pascal中数组的开始/结束,包括负值。ARRAY [-5 ..- 2]将创建一个包含4个元素的数组。
丹·代尔

3

PL / SQL。当使用从0开始的语言并与Oracle交互时,您需要自己处理0-1转换以按索引进行数组访问。在实践中,如果您使用诸如foreach跨行或按名称访问列之类的构造,这不是什么大问题,但是您可能想要最左边的列,例如第1列。



3

整个Wirthian语言系列(包括Pascal,Object Pascal,Modula-2,Modula-3,Oberon,Oberon-2和Ada(以及其他一些我可能忽略的语言))都可以从您喜欢的任何点对数组进行索引,显然是1。

Erlang从1开始索引元组和数组。

我认为但不再肯定,Algol和PL / 1都从1开始索引。我也很确定Cobol从1开始索引。

基本上,C之前的大多数高级编程语言都从1开始进行索引(由于明显的原因,汇编语言是一个显着的例外-原因是C从0开始进行索引),直到今天,许多由C主导的霸权之外的语言仍在这样做。



2

Visual FoxPro,FoxPro和Clipper都使用数组,其中元素1是数组的第一个元素...我认为这就是1索引的意思。


2

我看到这里的fortran知识仍然是'66版本。

Fortran具有变量的上下边界。

意思是,如果您声明一个数组,例如:

real, dimension (90) :: x

那么1将是下限(默认情况下)。

如果你声明像

real, dimension(0,89) :: x

但是,它的下限为0。

另一方面,如果您声明它像

real, allocatable :: x(:,:)

然后您可以将其分配给您喜欢的任何对象。例如

allocate(x(0:np,0:np))

表示数组将具有元素

x(0, 0), x(0, 1), x(0, 2 .... np)
x(1, 0), x(1, 1), ...
.
.
.
x(np, 0) ...

还有一些更有趣的组合:

real, dimension(:, :, 0:) :: d
real, dimension(9, 0:99, -99:99) :: iii

留给有兴趣的读者作为作业:)

这些只是我想起的那些。由于fortran的主要优势之一是数组处理功能,因此很明显,这里没有提到许多其他输入输出。


VB默认情况下从0开始(来自最早的BASIC)。
帕维尔·米纳夫

@Pavel Minaev-我的错 已纠正。
Rook




2

基本-不仅是VB,还包括所有1980年代旧的行编号版本。

理查德





0

尽管C的设计使索引为0,但仍可以将C中的数组安排为被索引为1(或任何其他值)的数组。您不会期望普通的C编码器经常执行此操作,但有时会有所帮助。

例:

#include <stdio.h>
int main(){
    int zero_based[10];
    int* one_based;
    int i;
    one_based=zero_based-1;

    for (i=1;i<=10;i++) one_based[i]=i;
    for(i=10;i>=1;i--) printf("one_based[%d] = %d\n", i, one_based[i]);
    return 0;
}

5
根据ISO C,1从中减去的行zero_based是未定义的行为-将指针移到数组中第一个元素之前是非法的。例如,一致的实现可能会插入将由您的代码触发的越界检查。
帕维尔·米纳夫09年

确实如此。我只是将其发布为一个有趣的好奇心,而不是认真的编程技术。在gcc中,只要有人停留在原始数组的范围内,就不会发生任何不良情况。
MAK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.