C++、C#、C、D、Java、...はゼロベースです。なぜ配列インデックスはほとんどのプログラミング言語に基づいてゼロですか?
Matlabのは、私はそれが新しい言語だけのプログラマは精通している既存の規則を使用しようと、ほとんど歴史的な理由を持っていると思います。1.
C++、C#、C、D、Java、...はゼロベースです。なぜ配列インデックスはほとんどのプログラミング言語に基づいてゼロですか?
Matlabのは、私はそれが新しい言語だけのプログラマは精通している既存の規則を使用しようと、ほとんど歴史的な理由を持っていると思います。1.
から始まり、私が知っている唯一の言語です。
このルールの元になった古い言語は金属に近く、インデックスは実際に開始要素からの距離であるため、0
は最初の要素に意味があります。
配列は、アイテムのリストの先頭からのオフセットを表すcおよびC++に基づいてゼロです。
これらの2つの行は、cで同じ結果になります。
anArray[3] = 4;
*(anArray +3) = 4;
最初は標準のインデクサで、2番目のポインタはidを3に加算してからそれを切り捨てます。インデクサと同じです。
これは 'int *'配列であると仮定して '3 * sizeof(int) 'を追加します。これはポインタ演算です。 – dramzy
配列はある値を参照するためにポインタ算術演算を使用するので、私は推測します。基本的に配列には連続したメモリがあり、5番目の要素(a [4])を参照する場合は、intの+ 4 *サイズが実行されます。
5番目の要素を参照すると、 +(5-1)* intのようなことをしてください
おそらく "C"はそれが効率的だからでしょう。 0ベースの配列内のアイテムのアドレスを計算するには、ItemSizeによって複数のインデックスを作成するだけで、(インデックス-1)* ItemSizeを計算する必要があります。 "C"と "C++"の中で最も一般的な言語であるため、新しい言語でも同じ規則に従わなければならないので、C/C++を使用する人たちの間違いを避けることができます。 しかし、この質問はofftopicと思われ、私はモデレータによって閉鎖されると思う。
P.S. Delphi/Pascalでは、文字列は1から始まりますが、配列の場合は範囲を指定する必要があり、好きなものを使うことができます。
よく、ダイクストラの有名な記事Why numbering should start at zeroを考えてみましょう。彼は、配列に有効なインデックスが0 <= i < N
と記述できることを意味するので、番号付けは0から始めるべきであると主張する。これは審美的なレベルで明らかに魅力的です。1 <= i < N + 1
より。
(一つは "なぜ0 < i <= N
を言わない"、頼むこともできますが、彼は審美的な理由のために、再び、あまりにも、それに対して主張している。)
'1 <= i <= N' - 審美的なレベルでさらに魅力的だと考えると、引数は少しフラットになり、関係演算子でさえも一致します。 :) – cHao
@cHao:それは2つの端点を減算すると、もはや配列の長さを取得しないということを意味するので、これは最悪のオプションです。実際には、配列スライシング機能が両端に含まれている言語のバグの原因です。 –
Eh。私は通常、 '(start、length)'を好む。あなたはしばしば "items X〜X + N-1"かそのようなものを望まない。あなたは "インデックスXで始まるN個のアイテム"を望んでいます。それで、長さの議論はすべて消え去る。最近ほとんどの自己尊重言語は、その長さを知っている配列を持っています。 – cHao
10個の整数0..9があるので
参照してくださいます。http:/ /programmers.stackexchange.com/q/110804/7043(悲しいことに、重複して閉じることはできません - プログラマにSEを移動し、それを閉じてしまうのは愚かなようです)。 – delnan
Matlabだけではありません。 Fortranは、1ベースの索引付けの良い例です。私は0ベースのインデックスは一般的なプログラミングでは良いと思っていますが、1ベースのインデックスは数学にとってより自然です。 – German