web-dev-qa-db-ja.com

インデックス配列の位置がゼロでない他の一般的な「c-like」または非「c-like」言語はありますか?

Cプログラミング言語は、ゼロインデックス配列言語として知られています。配列の最初の項目には、0を使用してアクセスできます。たとえば、double arr[2] = {1.5,2.5}配列の最初の項目arrは0の位置にあります。arr[0] === 1.5 1ベースのインデックスとはどのプログラミング言語ですか?

ALGOL、Matlab、Action!、Pascal、Fortran、Cobolなど、これらの言語は配列アクセス用に0ではなく1から始まると聞いています。これで完了ですか?

具体的には、1ベースの配列は、ゼロではなく1で最初の項目にアクセスします。

74
Alec Jacobson

リストは wikipedia にあります。

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

Fortranは1から始まります。お父さんは生まれる前にFortranをプログラミングしていたので(私は33歳です)、彼は0から始まると現代のプログラミング言語を本当に批判しています。など。

ただし、0から始まるものは非常に自然です。私の最初の本当のプログラミング言語はCで、nがゼロから始まっていなければ*(ptr + n)はそれほどうまく機能しなかったでしょう!

18
Adrian Smith

言語のかなり大きなリストは、ウィキペディアの プログラミング言語の比較(配列) 「配列システム相互参照リスト」テーブル(デフォルトのベースインデックス列)にあります。

これ 1-対0-インデックス付きおよびサブスクリプション全般に​​ついての良い議論があります

ブログから引用するには:

E.W.ダイクストラによるEWD831、1982年.

要素を下付き文字で区別したい長さNのシーケンスを扱う場合、次の厄介な問題は、その下付き文字の値を開始要素に割り当てることです。規則a)を順守すると、添え字1で始まる場合、添え字の範囲1≤i <N + 1が得られます。ただし、0から開始すると、より良い範囲0≤i <Nが得られます。したがって、序数をゼロから始めましょう。要素の序数(添字)は、シーケンスの前にある要素の数と等しくなります。そして、この物語の教訓は、私たちが(これらすべての世紀の後で)より自然な数字としてゼロを考慮したということです。

注::多くのプログラミング言語は、この詳細に注意を払うことなく設計されています。 FORTRANでは、添え字は常に1から始まります。 ALGOL 60およびPascalでは、条約c)が採用されました。より最近のSASLは、FORTRAN規則に基づいています。SASLのシーケンスは、同時に正の整数の関数です。残念! (発言の終わり)

14
DVK

また、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
11
Schedler

Fortran、Matlab、Pascal、ALGOL、Smalltalk、その他多数。

11

Perlでできます

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

そのように感じたら、42から始めることもできます。これは文字列インデックスにも影響します。

実際にこの機能を使用することは強くお勧めしません。

11
Thilo

JDBC(言語ではなく、API)

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

Erlangの タプル および リスト インデックスは1から始まります.

7
Greg Hewgill

ルア-残念なことに

5
matja

見つかったもの- Lua(プログラミング言語)

配列セクションを確認してください-

「Lua配列は1ベースです。他の多くのプログラミング言語では、最初のインデックスは0ではなく1です(ただし、明示的なインデックス0は許可されます)」

4
Sachin Shanbhag

VBクラシック、少なくとも

Option Base 1
4
Dario

Delphi の文字列は1から始まります。

(静的配列には明示的に下限を指定する必要があります。動的配列は常に0から始まります。)

4
gabr

PL/SQL 。この結果は、0から始まる言語を使用し、Oracleと対話する場合、インデックスによる配列アクセスのために0-1変換を自分で処理する必要があります。実際には、行でforeachのような構造を使用するか、名前で列にアクセスする場合、それはそれほど問題ではありませんが、たとえば、一番左の列が列1になります。

3
Gaius

Pascal、Object Pascal、Modula-2、Modula-3、Oberon、Oberon-2、Adaを含むWirthianの一連の言語(および私がおそらく見落としていた他のいくつかの言語)を使用すると、好きなポイントから配列にインデックスを付けることができます。明らかに、1。

Erlangは1からタプルと配列にインデックスを付けます。

ALGOLとPL/1はどちらも1からインデックスを作成していると思いますが、もはやポジティブではありません。Cobolが1からインデックスを作成していることも確信しています。

基本的に、Cが1からインデックス付けされる前のほとんどの高レベルプログラミング言語(明らかな理由でアセンブリ言語が顕著な例外であり、Cが0からインデックス付けされる理由)と、Cが支配するヘゲモニー以外の多くの言語は今でもそうです。

CFMLでは、インデックスは1から始まります。

3
davidcl

ColdFusion-Javaフードの下

3
andrewWinn

アダとパスカル。

3
Dave

XPathについては誰も言及していません。

2

すでに述べた他の言語に加えて、MathematicaとMaxima。

2
Lorenzo Stella

Smalltalkもあります

2
Dawie Strauss

すでに言及した他の言語に加えて、informix。

2
Javi Moya

Visual FoxPro、FoxPro、およびClipperはすべて、要素1が配列の最初の要素である配列を使用します。

2
PilotBob

基本-VBだけでなく、1980年代のすべての古いライン番号バージョン。

リチャード

2
winwaed

ここで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の主な強みの1つは配列処理機能であるため、ここで言及されていない他の多くの入出力が存在することは明らかです。

2
Rook

RPG(最新のRPGLEを含む)

1
Internet man

FoxProインデックス1から始まる配列を使用しました。

1
Robert Cartaino

dBASEは、インデックス1から始まる配列を使用していました。

dBASEの配列(開始)

1
Robert Cartaino

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;
}
0
MAK