是否有其他常见的“类 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
的,并且数字声明了上限(有效索引范围从0
到10
)。这很合适,因为 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”语言具有非零索引数组位置? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章