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

Posted

技术标签:

【中文标题】是否有其他常见的“类 c”或非“类 c”语言具有非零索引数组位置? [关闭]【英文标题】:Are there other common "c-like" or non "c-like" languages with non zero index array position? [closed] 【发布时间】:2010-12-02 18:05:28 【问题描述】:

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 访问第一项。

【问题讨论】:

这应该是一个维基 为什么人们投票支持“不是一个真正的问题”?这显然是一个真实的问题。它可能不是该网站见过的最好的,也可能是接近的,但肯定不是因为它“不是一个真正的问题”。 几乎所有的东西都来自 C 之前,因为整个零索引的东西一开始是作为一个汇编器/C 实现工件(因为真正的人类不从零开始计数)。因此,Basic(s)、COBOL、Fortran(s) 以及大多数源自它们的语言。 我猜标题的格式不正确,但正文肯定是。这怎么不是一个真正的问题? 克里斯·卢茨:RE:苦涩;还不是很苦,让我们说“脾气暴躁和不满”,尤其是。 w/本网站上的近距离投票。 RE:“编程食物”;你知道我用这个名字开玩笑,但实际上这里有一个几乎与这个已经开放一年的话题相同的话题:***.com/questions/92257/programmers-food。这就是让我感到不满的地方,这里的近距离投票与真正的编程问题无关,而一切与该网站所宠爱的某个程序员的亚文化有关。一种既狭隘又思想封闭的亚文化。 【参考方案1】:

可以在wikipedia找到一个列表。

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

【讨论】:

***上的东西不完全正确??说它不是这样! 请注意,它说的是“默认基本索引”,因此该部分是正确的。然而,不正确的是 BASIC 中的默认基本索引仍然是 0,而不是 1 - 所以我修复了它。 实际上,BASIC 改变了很多,尤其是在这一点上。 @Yannick:你知道任何人都可以编辑***,对吧?为什么抱怨不准确;纠正他们! @ST3,这可能是它在底层的工作方式,但 php 仍然称它们为数组,它们的基本行为(使用它们而不指定键)就像数组一样。【参考方案2】:

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

但是,我发现从 0 开始的事情很自然;我的第一个真正的编程语言是 C,如果 n 不是从零开始,*(ptr+n) 就不会工作得这么好!

【讨论】:

+1: 但这真的是给你父亲的,他和我差不多同时开始用 Fortran 编程。我希望当他教你数数时,他会教你像 1 头牛、2 头牛、3 头牛……现在谁不自然! @High Performance Mark 奶牛当然是不自然的。他们应该从 0 头奶牛开始。 在计算项目时,即使是 C 程序员也不会说有 0 个项目,如果有 1 个项目!但是第一项仍然可以有效地位于索引 0 处。 等等,这是否意味着在撰写本文时您是 33 或 34 岁? 33,这是他的第 34 年【参考方案3】:

一个相当大的语言列表在 Wikipedia 上的 Comparison of Programming Languages (array) 下的“阵列系统交叉引用列表”表(默认基本索引列)下

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

引自博客:

E.W. Dijkstra 的 EWD831,1982 年。

当处理一个长度为 N 的序列时,我们 希望通过下标来区分, 下一个令人头疼的问题是什么下标 分配给它的起始值 元素。遵守约定 a) 以下标开头时产生 1、下标范围1≤i

备注:: 许多编程语言的设计都没有经过适当的 注意这个细节。在 FORTRAN 中 下标总是从 1 开始;在算法中 60 并且在 PASCAL 中,约定 c) 具有 被采纳;最近的 SASL 有 回到 FORTRAN 公约: SASL 中的一个序列同时 正整数上的函数。 遗憾! (发言结束。)

【讨论】:

许多非 cs 工程师会(并且确实)不同意 Dijkstra 的一些观点,因为在远离键盘的数学中 1 仍然是数组的“默认”第一个元素. 另外,在 fortran 中,数组下标并不总是从 1 开始。 Dijkstra 当然提出了一个非常有偏见的观点。考虑到大多数人会将基于 1 的数组的范围描述为“1 ≤ i ≤ N”,这比“0 ≤ i ≤ N-1”要好得多。 是的,Dijkstra 的观点非常有偏见,此外,假设与现在人们的编码方式不同 - 现在,反对基于 1 的索引的论据比过去少得多,甚至如果只是因为for-in。【参考方案4】:

Fortran、Matlab、Pascal、Algol、Smalltalk 等等。

【讨论】:

Pascal 数组可以从任何索引开始,不一定是 0 或 1【参考方案5】:

你可以在 Perl 中做到这一点

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

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

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

【讨论】:

【参考方案6】:

同样在 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

【讨论】:

+1 这简直太疯狂了,每次都让我很生气,因为 Java 中的其他所有内容都是从零开始的! 这可能是因为 SQL 也使用基于 1 的索引,例如ORDER BY 1(第一列)或SUBSTRING(name, 2)(从第二个字符开始) 请注意,Hibernate 是一种流行的 Java ORM,它(通常)位于 JDBC 之上,它具有索引从 0 开始的 setString 方法。令人困惑。【参考方案8】:

Erlang 的 tuples 和 lists 索引从 1 开始。

【讨论】:

【参考方案9】:

Lua - 令人失望

【讨论】:

lua 的索引从 1 开始有什么问题?它使初学者对编程更加友好。【参考方案10】:

找到一个 - Lua (programming language)

检查数组部分,它说 -

“Lua 数组是从 1 开始的:第一个索引是 1,而不是像许多其他编程语言那样的 0(尽管允许显式索引 0)”

【讨论】:

【参考方案11】:

VB 经典,至少通过

Option Base 1

【讨论】:

基数 1?请不要,一元太笨拙了...... VB.NET 也是如此——Dim x(10) 创建 11 个元素的唯一语言…… @jleedev:不完全是——VB.NET 数组是基于0 的,并且数字声明了上限(有效索引范围从010)。这很合适,因为 VB 的 For 循环是 inclusive【参考方案12】:

Delphi 中的字符串从 1 开始。

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

【讨论】:

【参考方案13】:

ColdFusion - 即使它是 Java 的底层

【讨论】:

【参考方案14】:

艾达和帕斯卡。

【讨论】:

我不认为应该包括 Pascal,因为它使用 0 和 1 取决于正在查看的内容。字符串为 1,但数组为 0。 已经有一段时间了,但我相信你可以使用任何你喜欢的索引作为 Pascal 中数组的开始/结束,包括负值。 ARRAY[-5..-2] 将创建一个包含 4 个元素的数组。【参考方案15】:

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

【讨论】:

【参考方案16】:

CFML 中的索引从 1 开始。

【讨论】:

【参考方案17】:

整个 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 主导霸权之外的许多语言仍然这样做天。

【讨论】:

【参考方案18】:

还有Smalltalk

【讨论】:

【参考方案19】:

Visual FoxPro、FoxPro 和 Clipper 都使用数组,其中元素 1 是数组的第一个元素...我假设这就是您所说的 1-indexed。

【讨论】:

【参考方案20】:

我看到这里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 - 我的错误。已纠正。【参考方案21】:

没有人提到 XPath。

【讨论】:

+1。另见***.com/questions/3319341/…【参考方案22】:

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

【讨论】:

【参考方案23】:

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

【讨论】:

【参考方案24】:

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

理查德

【讨论】:

【参考方案25】:

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

【讨论】:

【参考方案26】:

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

Arrays (Beginning) in dBASE

【讨论】:

【参考方案27】:

RPG,包括现代RPGLE

【讨论】:

【参考方案28】:

尽管 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;

【讨论】:

zero_based 中减去1 的那一行是根据ISO C 未定义的行为——将指针移到数组中第一个元素之前是不合法的。例如,符合规范的实现可能会插入由您的代码触发的越界检查。 确实如此。我只是将其发布为一种有趣的好奇心,而不是一种严肃的编程技术。在 gcc 中,只要保持在原始数组的范围内,就不会发生任何不好的事情。

以上是关于是否有其他常见的“类 c”或非“类 c”语言具有非零索引数组位置? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

类 C 语言中的返回类型多态性

没有类,C语言有结构体,那么Go的结构体有啥特别之处?

5 友元类

避免重复代码:typedef/使用具有默认参数的模板类 (C++14)

常见的关系运算符(缩减运算符)

具有抽象类的 C++11 对象组合