CとLuaの配列インデックスの特定の定義は異なります。
C配列では、次のことを意味します。配列アドレスのアイテムアドレスオフセット。
Lua配列では、次のことを意味します。配列のn番目の項目。
ほとんどの言語が0ベースのインデックスを使用するのはなぜですか?のコンパイラコードoffset definition
はより便利で効果的だからです。それらは主にアドレスを処理します。
そしてルア。これは、Cを使用したテーブルインデックスのlua5.3.5のコードです。
const TValue *luaH_getint (Table *t, lua_Integer key) {
if (l_castS2U(key) - 1 < t->sizearray)
return &t->array[key - 1];
else {
Node *n = hashint(t, key);
for (;;) {
if (ttisinteger(gkey(n)) && ivalue(gkey(n)) == key)
return gval(n);
else {
int nx = gnext(n);
if (nx == 0) break;
n += nx;
}
}
return luaO_nilobject;
}
}
コードに焦点を当てる必要&t->array[key - 1]
があります。減算演算があります。0ベースのインデックスと比較して効果的ではありません。
しかし、1ベースのインデックスは人間の言語に近いです。英語、中国語、日本語などのn番目の項目に重点を置いています。
したがって、Luaの設計者は、1ベースのインデックスを選択し、純粋に新しいプログラムを簡単に理解できるように選択し、利便性と有効性を放棄すると思います。