プログラマは0から数える話
歴史的な理由
もともとC言語の array[i] は *(array + i) の構文糖であるが、もし配列のインデックスが1から始まるとすると array[i] を *(array + i - 1) としなければならなくなって都合が悪い。よって、C言語では配列のインデックスを0から始まるものとした。さらに、C言語から派生した各言語も、できるだけ混乱を避けるために(驚き最小の法則)C言語式のインデックスを採用した―――と言う感じで丁寧に説明すれば、インデックスが0から始まることは理解してもらえるはず。
インデックスが0から始まるもうひとつの理由?
幼素数要素数Nの配列の各要素に対して何らかの処理をしたいとき、インデックスが0から始まる場合は
for(i=0;i<N;i++){ printf("array[%d] = %d\n", i, array[i]); }
という風になるんだけども、もしインデックスが1から始まるものとすると
for(i=1;i<=N;i++){ printf("array[%d] = %d\n", i, array[i]); }
となるので、for の条件式が1文字多くなる。この1文字が許せない変態プログラマやショートコーダがたくさんいたので、現在も配列のインデックスは0から始まるようになっているんじゃないかとか思ったけどたぶんそんなことはない。