添字が0から始まるべき理由

えらいひとの原本

Why numbering should start at zero

初めに自然数の範囲の表現方法について考えてみよう。2, 3, … 12という範囲を条件式で書こうとすると下記のパターンが考えられる。

a) 2 <= i < 13
b) 1 < i <= 12
c) 2 <= i <= 12
d) 1 < i < 13

一見すると c) が「2~12」と表現するように、値の境界が明確で分かりやすいが、右側の数(12)から左側の数(2)を引いて要素の数を求めようとすると 10 となってしまい、1つ足りない状況になってしまう。

そこを回避しようとすると a) と b) が良いことになる。この両者には別のメリットが有り、例えば自然数の範囲のグループを複数用意したい場合、境界が重なり合うことなく表現できる。

a)
2 <= i < 13
13 <= i < 20

c) の例で同じことをしようとすると、下記の通り12が両方のグループに入ってしまう。

c)
2 <= i <= 12
12 <= i <= 20

かといって、下記のようにすると12と13で数字が異なってしまう。

c)
2 <= i <= 12
13 <= i <= 19

上記は数字が異なるだけで、人間が見れば分かりづらい訳では無いが、範囲を指定する数値を変数に置き換えると、c) は分かりづらくなってしまう。

a)
X1<= i < X2
X2 <= i < X3

c)
X1 <= i <= X2
(X2 + 1) <= i <= X3

ということで、c) が良さそうだ。

以上を踏まえて、本題の添字を0始まりにするか、1始まりにするかを考えてみる。長さNの配列を考えたとき、

1始まりの場合の添字の範囲
1 <= i < N + 1

0始まりの場合の添字の範囲
0 <= i < N

1始まりにしてしまうと終わりをN + 1となるが、0始まりにすると綺麗にNとなる。

ということで、配列の添字は0始まりがベストで、それに合わせて範囲指定も 0 <= i < N がベストということになります。

コメントする