是否有其他常见的“c-like”或非“c-like”语言具有非零索引数组位置?

时间:2009-09-30 18:06:20

标签: arrays programming-languages indexing

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访问第一个项目,而不是零。

28 个答案:

答案 0 :(得分:61)

列表可以在wikipedia找到。

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

答案 1 :(得分:18)

Fortran从1开始。我知道因为我的爸爸在我出生之前曾经为Fortran编程(现在我33岁)他真的批评现代编程语言从0开始,说它不自然,不是人类的想法,不像数学,等等。

然而,我发现从0开始的事情很自然;我的第一个真正的编程语言是C和*(ptr + n)如果n没有从0开始就不会那么好用!

答案 2 :(得分:14)

一个非常大的语言列表位于维基百科下的Comparison of Programming Languages (array)下的“阵列系统交叉引用列表”表(默认基本索引列)

This对1-对0索引和订阅进行了很好的讨论

引用博客:

  

E.W. Dijkstra的EWD831,1982。

     

当处理长度为N的序列时,我们的元素   希望通过下标来区分   下一个令人烦恼的问题是什么下标   分配给它的起始值   元件。遵守惯例a)   收益率,以下标开头   1,下标范围1≤i<1。 N + 1;   然而,从0开始,给出了   更好的范围0≤i<0。 N.让我们放手吧   我们的序数从零开始:   元素的序数(下标)等于   前面的元素数量   序列。和道德的   故事是我们更好的考虑    - 在所有这些世纪之后! - 零作为   最自然的数字。

     

备注::许多编程语言都是在没有应有的情况下设计的   注意这个细节。在FORTRAN   下标总是从1开始;在ALGOL   60和PASCAL,公约c)   被采纳;最新的SASL   落后于FORTRAN大会:   SASL中的序列同时存在   正整数的函数。   可怜! (备注完。)

答案 3 :(得分:11)

你可以在Perl

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

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

实际上非常不鼓励使用此功能。

答案 4 :(得分:11)

Fortran,Matlab,Pascal,Algol,Smalltalk以及许多其他人。

答案 5 :(得分: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

答案 6 :(得分:7)

Erlang的tupleslists索引从1开始。

答案 7 :(得分:6)

JDBC(不是语言,而是API)

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

答案 8 :(得分:5)

Lua - 令人失望

答案 9 :(得分:4)

Delphi中的字符串从1开始。

(静态数组必须明确指定下限。动态数组总是从0开始。)

答案 10 :(得分:4)

找到一个 - Lua (programming language)

检查阵列部分 -

“Lua数组是基于1的:第一个索引是1而不是0,因为它适用于许多其他编程语言(尽管允许显式索引为0)”

答案 11 :(得分:4)

VB Classic,至少通过

Option Base 1

答案 12 :(得分:3)

索引从CFML中的一个开始。

答案 13 :(得分:3)

PL/SQL。这样做的结果是当使用从0开始并与Oracle交互的语言时,您需要自己处理0-1转换,以便通过索引进行数组访问。实际上,如果您使用foreach之类的结构来覆盖行或按名称访问列,那么这不是什么大问题,但您可能需要最左边的列,例如,第1列。

答案 14 :(得分: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主导霸权之外的许多语言仍然这样做一天。

答案 15 :(得分:3)

Ada和Pascal。

答案 16 :(得分:3)

ColdFusion - 即使它是引擎盖下的Java

答案 17 :(得分:2)

Mathematica和Maxima,除了已经提到的其他语言。

答案 18 :(得分:2)

informix,除了已经提到的其他语言。

答案 19 :(得分:2)

基础 - 不仅仅是VB,而是所有旧的20世纪80年代的行编号版本。

理查德

答案 20 :(得分:2)

没人提到XPath。

答案 21 :(得分: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的主要优势之一是阵列处理能力,很明显这里没有提到很多其他的输出。

答案 22 :(得分:2)

Visual FoxPro,FoxPro和Clipper都使用数组,其中元素1是数组的第一个元素......我假设你的意思是1索引。

答案 23 :(得分:2)

还有Smalltalk

答案 24 :(得分:1)

RPG,包括现代RPGLE

答案 25 :(得分:1)

dBASE 使用从索引1开始的数组。

Arrays (Beginning) in dBASE

答案 26 :(得分:1)

FoxPro 使用从索引1开始的数组。

答案 27 :(得分:-1)

虽然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;
}