- PR -

配列の添字が0から始まるメリットは?

投稿者投稿内容
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-03-07 18:26
そもそもどの言語を使っているときの疑問なのでしょうか。
らぶまさんの書き込みの通り、Cではa[n]は*(a+n)のシンタックスシュガーに過ぎないから
ですし、C++やJavaはCの言語仕様を引き継いでいるからですね。

一方Fortranのように1オリジンの言語もありますし、VBだとオリジンをどこからにするのかを
指定できますよね(VB.netは知りませんが)。

なので、さして意味があるわけではなく、歴史的経緯にすぎない、と思います。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-03-07 21:06
次のように考える、となにかの本で見た覚えがあります。
(カーニハンだったか、ワインバーグだったか)

0から始まる場合:

a[0] .. 配列の先頭からの距離が0
a[1] .. 配列の先頭からの距離が1

1から始まる場合:

a[1] .. 配列の1番目の要素
a[2] .. 配列の2番目の要素


また、この話題で思い出したのですが、
Microsoft系BASICだと、添え字の開始番号を0か1に切り替える命令があったと思います。
(OPTION BASE、だったかな)

また、Pascalだと添え字の範囲を指定できるので、a[-5] ってのも可能だったはず。

あと、perlだと$a[-1]は配列の最後の要素、$a[-2]は最後から2番目、だったかも。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-03-07 21:13
unibon です。こんにちわ。
#私は0派です。1から数え始めるなんて考えられない。

引用:

はにまるさんの書き込み (2005-03-07 16:01) より:
  なぜ、配列の添字指定は0からなのに、
  配列サイズの取得関数戻り値は1からとなるのか?

誰もが一回は、これを原因としたバグを経験し
「なんで0から何だよ!」と独り言を過去に呟いたのは、私だけじゃない筈。


「なんで1からなんだよ!」と怒鳴ったことはあります。
VB の Collection とかは1から数え始めますよね。これに良く泣かされました。
#1から数え始める流儀は、呼称としては「1オリジン」とか他にもいくつか言い方はあったかもしれません。

引用:

はにまるさんの書き込み (2005-03-07 16:01) より:
しかし、ふと思いました。
もしかして配列が0から始まるのは何か意味深いモノがあるのでは無いか?

そこで質問です。「配列が0から始まるメリットは何ですか?」


私も問いたい。
もしかして配列が1から始まるのは何か意味深いモノがあるのでは無いか?
そこで質問です。「配列が1から始まるメリットは何ですか?」

子供の頃、病院かなにかの待合室で、待ち番号を知らせる電光掲示板があって、

01 02 03 04 05 06 07 08 09 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
...

という並びでした。右端の十の桁だけが他と違うことに違和感がありました。

00 01 02 03 04 05 06 07 08 09
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
...

のほうがキレイなのに、と思った。

#あとで誤字修正。

[ メッセージ編集済み 編集者: unibon 編集日時 2005-03-07 21:15 ]
会社員
ベテラン
会議室デビュー日: 2003/01/21
投稿数: 50
投稿日時: 2005-03-07 23:32
アセンブラ(機械語)をやってみるとわかりますが、内部的には配列が0から始まったほうが都合がいいのです。
高級言語が1から始まっても動作するのは、コンパイラが機械語を出力する際、1を引くロジックを出力しているからです。
この1を引くロジックは、コンパイラやアーキテクチャごとに違うのではっきりとはいえませんが、1命令(2〜6バイト)くらいかと思います。
つまり、配列を1から始めた場合、記述1箇所につき余分な命令が1回実行され、実行形式が2〜6バイト大きくなります。
業務アプリの場合はたいして問題ありませんが、組込系のような速度・メモリがシビアな場合には問題になります。

厳密にいうともっと複雑ですが(添字が定数の場合は増えない等)、あまり詳しくないのでやめときます。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-03-07 23:39
0/1のどっちと言われればJavaで慣れているので0ですが、
高級言語を使う以上、言語仕様が0であれば0でいいし、
1であれば1でも全然構いません。
一番困るのは、同じ言語でもAPIによって要素へのアクセスが
0で始まるものや1で始まるものと、バラバラだったりしますよね。
JavaでもSQL関係のパッケージはカラムへのアクセスが1から始まります。
気づかずコンパイルして、1度目は必ずコンパイルエラーです。。。
コンパイラはエラーを吐かないですからね。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-03-08 08:42
るぱんです。

VB6.0では
『Option Base 0』
『Option Base 1』
と言う添え字の開始をずらせた覚えがあります。

この辺に起因するバグもたくさん見てきましたが・・・。汗

・・・と言うか、何を持って高級言語なのでしょうか?
定義がすくな-い気がします。
パテ太
ベテラン
会議室デビュー日: 2004/08/16
投稿数: 64
お住まい・勤務地: 千葉・東京
投稿日時: 2005-03-08 09:15
引用:

・・・と言うか、何を持って高級言語なのでしょうか?
定義がすくな-い気がします。


パテ太です。
パッと見『強そうなのが高級言語』です。・・・と思います。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-03-08 09:23
http://www.atmarkit.co.jp/icd/root/67/14075567.html
これを読む限り、アセンブリ言語以外は
高級言語という定義になっていますね。

スキルアップ/キャリアアップ(JOB@IT)