プログラミング言語でindexが0から始まる理由

2から12までの11個の自然数からなる数列を、次の4つの方法で表すことができます。どちらの方法が数列を表すのに最適な方法かを見てください。

a）2 ≦ i < 13（2以上13未満）13 - 2 = 11

b）1 < i ≤ 12（1秒と12以下）12 - 1 = 11

c）2 ≦ i ≦ 12（2以上12以下）12 - 2 = 10

d）1 < i < 13（1秒と13未満）13 - 1 = 12

a)とb)方式は、範囲開始値（下限）と範囲終了値（上限）の差が実際の数列に含まれる数の数と同じであるという利点があります。たとえば、a)方式の場合、数列範囲の終了値から範囲の開始値を減算すると、13 - 2 なので、11 となります。この値は、2から12までの数字の11個の数に等しくなります。b)方式も同様です。

b)とd)方式の場合、範囲開始値は自然数の範囲外です。（自然数は1から始まります。）この方法はあまり見えないので、通常は自然数を開始値とするためa)とc)のように≤を使用することをお勧めします。

範囲の開始値を含めるには≤を使用し、範囲の終了値を見てみましょう。上記の4つのケースのうち、aとcのいずれかを選択します。

a）2 ≦ i < 13（2以上13未満）13 - 2 = 11

c）2 ≦ i ≦ 12（2以上12以下）12 - 2 = 10

最小の自然数から始まる数列（一度は1を意味します）を考えてみましょう。要素を持たない空の数列を表現するとき、c)のように範囲の終値を含めるために≤を使用することは厄介です。なぜなら、次のように空の数列を表すことはできません。

c) 1 ≤ i ≤ 1

したがって、範囲の終了値を含めないように、a)方式のように < を使用する必要があります。

1 ≤ i < 1

この場合、i が 1 以上で同時に 1 未満のこれらの条件を満たす整数 i は存在しないため、この表現はどの整数も含まない空の数列を表します。

前に2つの検討を総合してみると、数列を表すときに私たちはa)方式を選択しなければなりません。

a) 2 ≤ i < 13

再整理すると、自然数の数列を表す場合は、j ≦ i < kと書く必要があります。

範囲の開始値（基準）の場合は、j < iの代わりにj ≦ iを使用する必要があります。なぜなら、最も小さい自然数から数列が始まらなければならないからです。最小の自然数よりも小さいものを追加することは厄介で不可能です。

範囲の終了値（上限）は、k ≦ iの代わりにk < iを使用する必要があります。空の数列を考えると、k ≦ i < kは空の数列ですが、k ≦ i ≦ kは空の数列ではないからです。

a)方式を使用する場合のもう1つの利点は、2つの数列を結束するのが簡単です。

たとえば、z ≦ i < yで表される数列とy ≦ i < xで表される数列を1つに連結すると、z ≦ i < yになります。 2つの数列を連結した後も同じように表記されますね。もう一度見ると、数列の範囲終了値と他の数列の範囲開始値が同じになります。

これまでの範囲の開始値と範囲の終了値を範囲に含めるかどうかを見てきました。

それでは、長さNの数列を扱うとき、インデックスを使用して数列の数を指すとしましょう。それでは、インデックスの開始値としてどの値を使用する必要がありますか。

インデックスが 1 から始まる場合、インデックスの範囲は 1 ≤ i < N+1 になり、インデックスが 0 から開始すると 0 ≤ i < N になります。直感的にN個の自然数で構成されることを認識するには、インデックスを0から始めることをお勧めします。なぜなら、元素のインデックスは数列でその前にある元素の数と同じです。

前に、数列を自然数範囲にするため範囲開始値を自然数にするため<の代わりに≦を使用しなければならないとし、今や自然数ではなく0を範囲開始値に含めなければならないことは理解されませんね。

注意点は、数列に含まれる数の数を数えることとインデックス付けすることには違いがあります。

|  | 1 | 2 | 3 | 4 | 5 |
| - | - | - | - | - | - |
| インデックス | 0 | 1 | 2 | 3 | 4 |
| 数字 | 1 | 2 | 3 | 4 | 5 |

インデックスが0から始まる理由の1つはメモリです。たとえば、メモリに配列を格納する場合、インデックスは配列の開始位置を指す必要があります。なぜなら、配列の最初の要素の位置は開始アドレスからのオフセットがゼロであるため、当然インデックスが0になります。

以下はChatGPTを使って調査した結果です。

インデックスがゼロから始まるプログラミング言語がほとんどであり、これらの設計決定は主にコンピュータサイエンスの基本原理とメモリ管理の効率に関連しています。ここでは、いくつかの代表的な言語とその理由を紹介します。ここで言及されている言語はC言語の影響によるものです。

1. C言語：インデックスが0から始まる最も代表的な言語の1つです。C言語では、配列の名前は配列の最初の要素を指すポインタとして使用されます。したがって、配列の最初の要素は0番目のインデックスを持ちます。これらの設計はメモリアドレス計算を簡素化し、ポインタ算術を直感的にします。

2. Java：JavaもC言語の影響を受けて0からインデックス付けを開始します。JavaはCと同じ方法で配列を処理します。これは、メモリアドレス計算の一貫性と効率性のための選択です。

3. Python：Pythonも0からインデックス付けを開始します。Pythonでは、この方法はC言語の配列管理方法に従うことであり、コンピュータメモリに近い低レベルのデータ構造を効率的に処理するためです。

4. JavaScript：Web開発に広く使用されているJavaScriptも、0から始まるインデックス付けを使用します。これは、初期のWeb開発でC言語の影響を受けた痕跡です。

これらの言語で0から始まるインデックスを使用する主な理由は、コンピュータメモリのアドレス方式と密接に関連しています。コンピュータメモリはアドレスにデータを格納してアクセスし、配列の最初の要素が開始アドレスに位置するので、0から始まるインデックス付けはメモリアドレス計算を単純かつ効率的にします。これはポインタ算術を容易にし、全体的なプログラミングの効率と一貫性を高めます。

インデックスが1から始まるプログラミング言語は比較的少なく、これらは主に数学的な利便性、歴史的理由、またはデザイン哲学のためにこの選択をしました。

1. Fortran：1950年代に科学と工学の計算のために開発されたFortranは、配列インデックス付けを1から開始します。これは、数学的表現との密接な関連が原因である可能性があります。科学者やエンジニアは伝統的に1から数を数えることに慣れているので、Fortranはこれらの慣行を反映しています。

2. MATLAB：工学および数学の分野で広く使用されているMATLABも、1からインデックス付けを開始します。これはFortranの影響を受けている可能性があり、行列ベースの計算で1から始まる方がより直感的になる可能性があります。

3. Lua：ゲーム開発およびEmbedシステムで使用されるLuaプログラミング言語も、1からインデックス付けを開始します。これはLuaのデザイン哲学に関連しており、ユーザーフレンドリーな言語構造を提供するための選択肢のようです。

4. R：統計計算とグラフィックの言語であるRも1から始まるインデックスを使用します。これは、統計学における伝統的な数学的表現を反映することであり得る。

これらの言語で1から始まるインデックスを使用する理由は、主にその言語のユースケースとターゲットユーザーグループに基づいています。科学、工学、統計学などの分野では、伝統的に1から数を数えることが普遍的であるため、これらの分野のために設計された言語はこれらの慣行を反映する傾向があります。

原本：
https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html?fbclid=IwAR0CN13rw8tsEOOa9D7ZVmaQRUTfpT6MmJz70NoNLPasWdZ6F_CPBsdHAnM_aem_AYQpjubPMUJkRJm3V5M-psyU5k3aNTdtlJrd-jpKhoEzgwVUvunalQl1fl7QXAv3LDA