配列のインデックスが常に 0 から始まるのはなぜですか? バイナリと何か関係がありますか?例えば:
var myArray = [5,6,7,8];
数字の 5 にアクセスするには、次のように言う必要があります。
myArray[0]
しかし、なぜ?
いいえ、本当の問題はありません。あなたが明らかに言うことができるように、私はこのことに慣れていません。
配列のインデックスが常に 0 から始まるのはなぜですか? バイナリと何か関係がありますか?例えば:
var myArray = [5,6,7,8];
数字の 5 にアクセスするには、次のように言う必要があります。
myArray[0]
しかし、なぜ?
いいえ、本当の問題はありません。あなたが明らかに言うことができるように、私はこのことに慣れていません。
これは100回回答されていると思いますが、噛みつきます。
「インデックス」または「キー」を見る 1 つの方法は、「オフセット」です。
myArray
基本的に、一連のアイテムの最初のアイテムへのポインターとして機能します。具体的には、メモリ内の数字「5」を指します。したがって、 「 + 1 アイテムmyArray[1]
の最初の要素の位置」と言うようなものだと言うと、最初の要素を飛び越えることになります。myArray
C では、*myArray
(ポインター逆参照) を記述すると、実際には最初の要素が返されます。
#include <stdio.h>
int main(void) {
int myArray[] = {5,6,7,8};
printf("%d",*myArray); // prints "5", equivalent to myArray[0]
printf("%d",*(myArray+1)); // prints "6", equivalent to myArray[1]
return 0;
}
「それがコンピューターの仕組みだ」というよりも、もっと実際的な理由もあります。
歴史的な理由についての素敵なブログ: http://developeronline.blogspot.fi/2008/04/why-array-index-should-start-from-0.html
これは基本的なコンピューター サイエンスの話で、メモリが非常に限られていた時代にさかのぼります。すべてが 1 ではなく 0 で始まっていたのです。0 から始めれば、1 桁で合計 10 まで数えることができたからです。
あなたは明らかにこれに慣れていません、私を信じてください、これからは 0 、 1 、 2 、 3 を数えることになります!
Javascript では、他の多くの言語と同様に、配列は常にインデックス 0 から始まりますが、すべての言語でそうではありません。
たとえば Pascal では、下限と上限を定義するので、インデックス 3 から配列を開始できます。
var myArray: Integer[3..6];
項目にアクセスするときに最も効率的であるため、配列をゼロから開始するのが最も一般的です。他のインデックスから開始する場合、アイテムが格納されているアドレスを計算するときに、その値を減算する必要があります。その余分な計算は今日では問題になりませんが、C のような言語が構築されたときは確かに問題でした。
(まあ、Javascript の配列は、実際には他のほとんどの言語とはまったく異なる方法でアクセスされますが、インスピレーションの源であるほとんどの同様の言語がそうであるため、0 から始まるインデックスを使用します。)
ウィキペディアには次のような説明があります。
インデックスの原点
C などの一部の言語では、任意のインデックスの有効な最小値が 0 であるゼロ ベースの配列型のみが提供されます。この選択は、配列の実装とアドレスの計算に便利です。C などの言語では、任意の配列の内部へのポインターを定義できます。これは、負のインデックスに対応する疑似配列としてシンボリックに機能します。これは、使用時に C が境界に対してインデックスをチェックしないためにのみ機能します。他の言語では、各インデックスが 1 から始まる 1 ベースの配列型のみが提供されます。これは、行列と数列に対する数学の伝統的な慣例です。Pascal などのいくつかの言語では、n ベースの配列型がサポートされており、その最小の正当なインデックスはプログラマによって選択されます。それぞれの選択の相対的なメリットは、激しい議論の対象となっています。 ゼロベースのインデックス作成には、オフバイワンまたはフェンスポストエラーを回避するという点で、1 ベースのインデックス作成よりも自然な利点があります。さまざまな言語で使用されるベース インデックスについては、プログラミング言語 (配列) の比較を参照してください。