JavascriptやPHPの配列や関数などで

配列の最初の要素がary[0]に格納されたりsubstring()関数の起点がゼロであったりしますが
ゼロでなく1ではダメなのでしょうか。個人的にはary[1]ary[2]ary[3]の方が1番目がary[1]という感じでわかりやすいのですが、ゼロから始まる利点が知りたいです

回答の条件
  • 1人5回まで
  • 登録:2008/05/24 17:45:26
  • 終了:2008/05/26 01:36:03

ベストアンサー

id:Sampo No.1

Sampo回答回数556ベストアンサー獲得回数1042008/05/24 18:05:43

ポイント30pt

言語としては、0始まりでも1始まりでも整合性がとれなくなることはないので、どちらでもいいのです。

現に、BASIC系の言語ではOPTION BASE命令という命令があって、これは配列を0始まりにするか1始まりにするか設定するためのものです。

では、JavascriptなりPHPなりのC系の言語ではなぜ配列の底が0に固定されているのか?

これは、Cの実装の問題に行き着きます。

Cでは、配列というものを「連続したメモリ空間の、先頭アドレス」で表現していました。

そのメモリ空間の、最初の要素のアドレスは?

「先頭アドレス+0」ですね。2番目の要素のアドレスは「先頭アドレス+1(*その変数型のバイトサイズ)」です。

底が0にしておけばメモリアドレス計算がシンプルになる、というのがCでの事情です。

JavascriptやPHPなど、Cの文法を借用しただけのスクリプト言語にも同じ事情が存在するとは考えにくいです。もっと複雑な配列管理をしているはずなので。

しかし、文法を引き継いだ関係上、「0でも1でもどちらでもいい」配列の底については、Cの0をそのまま引き継いだのでしょう。

id:dedara

なるほどわかりやすい回答ありがとうございます。

いつも釈然としない気持ちで作業していたのですっきりしました。

2008/05/24 18:51:19

その他の回答(3件)

id:Sampo No.1

Sampo回答回数556ベストアンサー獲得回数1042008/05/24 18:05:43ここでベストアンサー

ポイント30pt

言語としては、0始まりでも1始まりでも整合性がとれなくなることはないので、どちらでもいいのです。

現に、BASIC系の言語ではOPTION BASE命令という命令があって、これは配列を0始まりにするか1始まりにするか設定するためのものです。

では、JavascriptなりPHPなりのC系の言語ではなぜ配列の底が0に固定されているのか?

これは、Cの実装の問題に行き着きます。

Cでは、配列というものを「連続したメモリ空間の、先頭アドレス」で表現していました。

そのメモリ空間の、最初の要素のアドレスは?

「先頭アドレス+0」ですね。2番目の要素のアドレスは「先頭アドレス+1(*その変数型のバイトサイズ)」です。

底が0にしておけばメモリアドレス計算がシンプルになる、というのがCでの事情です。

JavascriptやPHPなど、Cの文法を借用しただけのスクリプト言語にも同じ事情が存在するとは考えにくいです。もっと複雑な配列管理をしているはずなので。

しかし、文法を引き継いだ関係上、「0でも1でもどちらでもいい」配列の底については、Cの0をそのまま引き継いだのでしょう。

id:dedara

なるほどわかりやすい回答ありがとうございます。

いつも釈然としない気持ちで作業していたのですっきりしました。

2008/05/24 18:51:19
id:rubikitch No.2

るびきち回答回数120ベストアンサー獲得回数222008/05/24 18:23:42

ポイント30pt

C言語の配列とポインタを学べば0起点になっている理由がわかると思います。

配列は先頭のポインタが指すアドレスと、オフセットという形になっています。

配列の先頭のアドレス=ポインタのアドレス、すなわちオフセット0なので0番目とみなすほうが都合がいいわけです。

C言語は長年広く使われている言語なので他の言語もそれに追随していると思います。

プログラミング言語においては、インデックスは0番目から数える文化です。

1起点の言語もあります。たとえばBASICなどの言語では1起点です。

Perlは変態で「$[」というグローバル変数で起点を変更できます。

id:dedara

ゼロ起点があまり感覚的になじまないのでPHPでも起点を変更できたらいいのにな、と思ってしまいました。回答ありがとうございます

2008/05/24 18:59:13
id:mokos No.3

mokos回答回数1ベストアンサー獲得回数02008/05/24 20:42:58

ポイント15pt

既に完璧な回答がついてるようですが、例えばプログラムを全く知らない人に説明するとしたら、こう説明します。

「年齢だって、生まれたとき0歳から始まるでしょ?0歳からはじめると、年齢=生きてきた年数になって分かりやすいよねー。」

id:dedara

たしかに年齢で考えれば「=生きてきた年数」となってわかりやすい気がしますが、それをプログラムのゼロ起点に当てはめると「生きてきた年数」に相当するものがいまいちピンと来ないです。

2008/05/25 02:21:06
id:rubikitch No.4

るびきち回答回数120ベストアンサー獲得回数222008/05/24 22:14:58

ポイント30pt

「N番目」を「インデックスがN」という表現に置き換えてみるとすっきりすると思います。

http://d.hatena.ne.jp/rubikitch/20080524/1211627661 ←考察

id:dedara

「インデックスがN」というのは無意識に頭の中でやっているかもしれません‥。

この質問をしたときは回答者の方々に「1から始まったら困ることがこんだけあるんだぞ」と言われるのを覚悟(というか期待)

していたのですが考察を読んで「ゼロ起点キモチ悪い」(=私)の考え方も変じゃないんだなと安心しました。

2008/05/25 02:15:34
  • id:humiya_r
    順番が違う
    a[0]の場合

    aの0番目ではなくて
    a起点から0番目

    ということです
    a[1]という場合は

    aの起点から1個目の値(1個ずれた) 

    という意味になります。

    つまり
    a[0]
    は aの起点から0個目(動いていない)=イコール
    つまり起点を指すということです


この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません