ようこそゲスト さん ユーザー登録 ログイン

JavascriptやPHPの配列や関数などで
配列の最初の要素がary[0]に格納されたりsubstring()関数の起点がゼロであったりしますが
ゼロでなく1ではダメなのでしょうか。個人的にはary[1]ary[2]ary[3]の方が1番目がary[1]という感じでわかりやすいのですが、ゼロから始まる利点が知りたいです JavascriptやPHPの配列や関数などで 配列の最初の要素がary[0]に格納されたりsubstring()関数の起点がゼロであったりしますが ゼロでなく1ではダメなのでしょうか。個人的.. を含むブックマークはてなブックマーク - JavascriptやPHPの配列や関数などで 配列の最初の要素がary[0]に格納されたりsubstring()関数の起点がゼロであったりしますが ゼロでなく1ではダメなのでしょうか。個人的.. - 人力検索はてな

  • dedara あなたも質問に答えられます! ウォッチリストに追加
  • 状態:終了 いるか
  • 回答数:4 / 45件
  • 回答ポイント:105ポイント
  • 登録:2008-05-24 17:45:26
  • 終了:2008-05-26 01:36:03
  • カテゴリー:コンピュータコンピュータ ウェブ制作ウェブ制作

1 回答者:Sampo 2008-05-24 18:05:43 満足! 30ポイント

言語としては、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をそのまま引き継いだのでしょう。

質問者:dedara 2008-05-24 18:51:19

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

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

2 回答者:rubikitch 2008-05-24 18:23:42 満足! 30ポイント

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

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

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

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

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

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

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

質問者:dedara 2008-05-24 18:59:13

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

3 回答者:mokos 2008-05-24 20:42:58 満足! 15ポイント

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

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

質問者:dedara 2008-05-25 02:21:06

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

4 回答者:rubikitch 2008-05-24 22:14:58 満足! 30ポイント

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

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

質問者:dedara 2008-05-25 02:15:34

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

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

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

おとなり質問

この質問・回答へのコメント

順番が違う
a[0]の場合

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

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

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

という意味になります。

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


この質問・回答へのトラックバックこの質問・回答へのトラックバック

配列の先頭要素が「0番目」であることは気持ち悪いか…「N番目」という言葉を考察してみる JavascriptやPHPの配列や関数などで 配列の最初の要素がary[0]に格納されたりsubstring()関数の
perl - 配列を1番目からはじめてみるperl - 配列を1番目からはじめてみる 404 Blog Not Found 2008-05-25 01:24:22
配列の先頭要素が「0番目」であることは気持ち悪いか…「N番目」という言葉を考察してみる - ’(rubikitch wanna be (a . lisper)) JavascriptやPHPの配列や関数などで 配列の最初の要素がary[0]に格
ruby - 配列を1番目からはじめてみる ref: perl - 配列を1番目からはじめてみる ref: 配列の先頭要素が「0番目」であることは気持ち悪いか…「N番目」という言葉を考察してみる - ’(rubikitch wanna
先頭要素が「1番目」であるFortran 最近とんと見なくなったFortranさんですがしまいには JavascriptやPHPの配列や関数などで 配列の最初の要素がary[0]に格納されたりsubstring()関数の起点がゼ
JavascriptやPHPの配列や関数などで 配列の最初の要素がary[0]に格納されたりsubstring()関数の起点がゼロであったりしますが ゼロでなく1ではダメなのでしょうか。個人的.. - 人力検索はてな Jav
0から始まるか1から始まるか。 >http://q.hatena.ne.jp/1211618724> ゼロでなく1ではダメなのでしょうか。 なぜそうなっているか‥それは実装上の都合であったり歴史的理由だったりする。 http
IMHO - 1オリジンIMHO - 1オリジン 2008-05-28 01:08:21
1オリジン JavascriptやPHPの配列や関数などで 配列の最初の要素がary[0]に格納されたりsubstring()関数の起点がゼロであったりしますが ゼロでなく1ではダメなのでしょうか。個人的.. -