- PR -

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

投稿者投稿内容
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2005-03-07 16:01
久々の惚けた質問です。

  なぜ、配列の添字指定は0からなのに、
  配列サイズの取得関数戻り値は1からとなるのか?

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

しかし、ふと思いました。
もしかして配列が0から始まるのは何か意味深いモノがあるのでは無いか?

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

_________________
人生変わっちゃうかもよ?OFF会参加者募集中今考えるな、参加してから考えろ。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2005-03-07 16:16
ども。

メリットねぇ…って言うかそういう次元じゃなく
言語の仕様で「なんでそういう風にしたの?」な気が…

おそらくメモリの割り当てとの関係でそうなった気がしますが。

※私もどうしてそうなったかは知りません
_________________
Inspired Ambitious
ISMS Assistant Auditor
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-03-07 16:26
こんにちは、じゃんぬねっと です。

引用:

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



Length プロパティとの比較で -1 しないといけないですもんね。(^^)
_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2005-03-07 16:43
SQLServerのSUBSTRING関数の文字列開始位置は【1】から
.net のString.Substring メソッドの文字列開始位置は【0】

ちゃんと意識してないとバグの元になるからどっちか統一してくれ...orz

---
誤字修正

[ メッセージ編集済み 編集者: えんぞ@見習 編集日時 2005-03-07 16:44 ]
らぶま
常連さん
会議室デビュー日: 2004/10/21
投稿数: 32
投稿日時: 2005-03-07 16:52
らぶまです。
お世話になります。

調べてみたら、K&Rの「プログラミング言語C第2版」にはこう書いてありました。

「Cにおいては、ポインタと配列との間に強い関係がある。
この関係は強いので、ポインタと配列を同等に論じなければならない。
・・・
a[i]という記法は、先頭からi番目の位置の配列要素を参照する。」

結局、Cの場合は
インデックスがメモリ上の相対位置を表す、つまり、
a[i] == *(a + i)
だから、でしょうかね。

Cに強い影響を受けた言語は、同じポリシを採用していることになるのでしょうか・・?


_________________
OFF企画中ご意見募集
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18610&forum=3&4

[ メッセージ編集済み 編集者: らぶま 編集日時 2005-03-07 18:25 ]
パテ太
ベテラン
会議室デビュー日: 2004/08/16
投稿数: 64
お住まい・勤務地: 千葉・東京
投稿日時: 2005-03-07 17:17
パテ太と申します。
普段 C 系列の言語を使っていて
「配列は 0 から始まるもの」だと思っていますので
メリットを意識したことはないです。
引用:

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


配列を全件操作する時に
配列のインデックスと個数を使用すると
コード:
for (int index = 0; index < size; index ++) {
    ・・・
}


となるので <= と書く必要がない。・・・
他に思いつかないのですが
だめですか?・・・
HIRO
常連さん
会議室デビュー日: 2003/04/15
投稿数: 20
投稿日時: 2005-03-07 17:45
オフセットとかポインタ的なものは「0始まり」とした方が直感的に受け入れやすく思います。

一方の Length、Size は数量ですから、そもそも比べる相手が違うんじゃないでしょうか。
まあ、確かに同時に使うシチュエーションが多いですけどね(^^)

なお、バグなどの原因になるのは、プロジェクト内で不統一になってる場合ですね。
パテ太さんの示してくれたようなよくあるループ記述でも、1で始めてみたり0で始めてみたりと・・・。
統一さえされていれば、どちらでも構わないと思います。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2005-03-07 17:48
皆さん御意見どうも。
らぷまさんの意見で、ピ、ピ〜ンと来た感じがします。

符号有りの1バイトでは -128 〜 -1, 0 〜 127 の表現が可能ですが、
業務系の私からすると、-128 〜 -100, 100〜127を利用する事は殆どありません。
理由は簡単で、業務系の数値情報は10進数が基本ベースにあり、例えば、
符号有りの1バイトでは、(10進数で)2桁までの問題無く表現が可能と
覚えている訳です。

すなわち、配列の添字を符号無しの1バイトで表現する場合、256個となり、
10進数ベース思考の私からすれば、
256個中の 1個位使えなくてもケチケチすんなよ!と思う訳です。

しかし、C言語の話が出て制御系や組込系の方で妄想するとなんとなく判った気がします。
制御系や組込系では、やっぱり数値情報は2進数が基本ベースにあると想定している訳ですが。

とすると、入出力や内部で扱う情報量として 256とか極普通にありえる訳ですよね。
こんな時に、添字が1〜255までしか配列表現出来ない場合は、
表現可能な数が1つ足らない為、変数領域を2バイト確保する必要があります。
もし、1〜256を0〜255に内部変換する対処が取られたとしても
今度、添字を別の数値変数に格納する場合、256という値が代入するのに2バイト確保が必要になります。

う〜ん。なんだか私の脳では、ごちゃごちゃしてきましたが。

という訳で
業務系を意識したアプリや言語は、配列が1から始まる。又は、1から始める指定が可能だったりする。
組込系や制御系を意識したアプリや言語は、配列は0から始まるのが当り前。

という事かな?と思いました。

業務系アプリでのメリットは、なさそうですね。

_________________
人生変わっちゃうかもよ?OFF会参加者募集中今考えるな、参加してから考えろ。

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