[C/C++] Cプログラミングの落とし穴 3.6 数え上げと非対称な境界 P39

『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

C言語以前のプログラミング言語(Fortran他)では配列の要素を示す添え字は1から始まりますが、C言語では0から始まります。

そのようなものと慣れ切っている我々とは異なり、当時の学者・実務家は相当混乱したようです。

以下のような1スタートのFor文を書いてしまい無限ループになるケースが結構あったみたいです。今のコンパイラではAbort trapエラーになります。

ではなぜC言語の添字は0スタートなのか。筆者によると引き算だけで要素数をカウントできるようにするためだそうです。

確かに0から9の配列の要素数を算出する式は9 – 0 + 1=10となり引き算の後に1を足す必要があります。0以上10未満という表現であれば10 – 0 = 10となり引き算だけで要素数を導き出せます。

まあこれはこれで最後の要素9と10未満の10に不一致が生じるというデメリットがあるのでどちらが優れているとは言えないと思います。コンピュータ目線で何かメリットがあるのであれば知りたいところです。

#include <cppstd.h>

int main() {
    int i, a[10];

    for (i = 1; i<=10; i++){
        a[i] = 0;
        cout << "i = " << i << endl;
    }

    return 0;
}
--------------------------------------------------
出力
--------------------------------------------------
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
Abort trap: 6