c言語 慣例としてi=0からはじまるのはなぜ?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
いりさいりさ

c言語 慣例としてi=0からはじまるのはなぜ?

#1

投稿記事 by いりさいりさ » 9年前

始めての質問失礼します。
次のC言語に関する慣例(javaやfortran77と比較した際の特徴)について色々な観点から調べなさい。
1. 慣例として i=0 からまわすのはなぜか?一方でi=1からがあまり使われないのはなぜか?
2. 慣例としてi<10 にするのはなぜか?一方でi<=9 を余り見ないのはなぜか?

(計算機システムIやIIで学んだ)機械語ではどう書かれるかを考えた際の観点も含めて構わない。
これを調べたのですが、よくわかりませんでした;;
1。は数学的には整数は無限大の範囲を持っているが、言語に限っては制限がある。その制限とは数を増加させていくと、いずれ負の数としての表記に変わってしまうため。
と思ったのですが違うのでしょうか?
ご指導ご鞭撻のほどよろしくおねがいします。

アバター
さかまき
記事: 92
登録日時: 9年前

Re: c言語 慣例としてi=0からはじまるのはなぜ?

#2

投稿記事 by さかまき » 9年前

「ご指導ご鞭撻」といわれるとなにも書けないので、自分の解釈を書きます。

配列を扱う時に使用する事が多いので、だと勝手に解釈しています。

たとえば、int a[10]はa[0]~a[9] だから、初期化で
for(i=0;i<=9;i++) a=0;
for(i=1;i<=10;i++) a[i-1]=0;
などと書くより
for(i=0;i<10;i++) a=0;
がわかりやすいです自分は。
設問では、機械語レベルに意味がありげなニュアンスですが
もしあったとしても慣例として使っている自分にしてみれば
使わない理由にはなりません。

アバター
toyo
記事: 35
登録日時: 9年前
住所: 宮崎県

Re: c言語 慣例としてi=0からはじまるのはなぜ?

#3

投稿記事 by toyo » 9年前

forループの変数は内部で配列のインデックスに使用することが多いからでしょうね
配列の個数を
#define NUM 10
のように定義した場合

コード:

for (i = 0; i < NUM; i++)
{
    array[ i ] = 0;
}
のように書くのでこの書き方に慣れちゃうんですよね

アバター
へろりくしょん
記事: 92
登録日時: 9年前
住所: 福岡

Re: c言語 慣例としてi=0からはじまるのはなぜ?

#4

投稿記事 by へろりくしょん » 9年前

すでに、答えは出てると思いますよ。
慣例として使われているのですから、何故かと聞かれればそれが慣例となっているからです。 としか答えようが無いわけですが。

多くの場合はそれが都合がいいからでは無いでしょうか。

例えば1ですが。 0から数える事はとても重要です。 具体的には配列を扱う場合など。
hoge[5] というコードは、*(hoge + 5) と全く同じ意味です。 これは、hoge を起点とし、+5という意味ですね。
であるならば、起点が hoge[0] となる事は至極普通の事です。

西暦2000年は21世紀ですが、西暦元年を起点とし、100年ごとに1世紀と数えていくなら、西暦0年~99年までは0世紀。 西暦100年は1世紀。 2000年は20世紀と数えていけば、直感的に分かりやすいと思うのですよ。 定規だって0を起点に1cm2cmとなっていて、1cm未満は0.ncmですね。 どうでもいい話ですが。


2もそうですが、慣例以外の言葉で、強いて表現するなら個人の好みかと。


慣例となっていることなら、他にも色々ありますね。 例えばループカウンタ等がそうです。

for(i = 0; i < 10; i++);

慣例としてループカウンタに i を多用するのは何故か? 一方で a や b があまり使われないのは何故か。

これもやっぱり答えは慣例だから。 です。 しかも古くは FORTRAN 時代から連綿と受け継がれ続けている慣例です。


追記です。
1。は数学的には整数は無限大の範囲を持っているが、言語に限っては制限がある。その制限とは数を増加させていくと、いずれ負の数としての表記に変わってしまうため。
必ずしもそうなるとは限りません。

たいちう
記事: 418
登録日時: 9年前

Re: c言語 慣例としてi=0からはじまるのはなぜ?

#5

投稿記事 by たいちう » 9年前

> 西暦2000年は21世紀ですが、西暦元年を起点とし、
> 100年ごとに1世紀と数えていくなら、西暦0年~99年までは0世紀。
> 西暦100年は1世紀。 2000年は20世紀と数えていけば、
> 直感的に分かりやすいと思うのですよ。 定規だって0を起点に1cm2cmとなっていて、
> 1cm未満は0.ncmですね。 どうでもいい話ですが。

どうでもいい話に対して亀レスですが、、、

西暦2000年は20世紀ですよ。
また、西暦0年は存在せず、西暦1年の前年は紀元前1年です。

http://ja.wikipedia.org/wiki/20%E4%B8%96%E7%B4%80
http://ja.wikipedia.org/wiki/%E7%B4%80% ... 1%E5%B9%B4

アバター
bitter_fox
記事: 607
登録日時: 9年前
住所: 大阪府

Re: c言語 慣例としてi=0からはじまるのはなぜ?

#6

投稿記事 by bitter_fox » 9年前

いりさいりさ さんが書きました:始めての質問失礼します。
次のC言語に関する慣例(javaやfortran77と比較した際の特徴)について色々な観点から調べなさい。
1. 慣例として i=0 からまわすのはなぜか?一方でi=1からがあまり使われないのはなぜか?
0から始めるのを慣例の一言で済ますのではなく、もうちょっと合理的に考えてみましょう。
配列へのアクセスは、0からですが、アルゴリズムによってはそうでないものもありますよね。
たとえば、素数を求めるプログラムでは2からループを始めますよね。
では、ループの初期値(i)はなにで決まるのかというと、ループ内のiの値の集合の中の最小値です。

例)
配列へのアクセスの際のiの集合は、{0, 1, 2, ..., max-2, max-1}で最小値が0なので初期値を0にします。
素数の集合は、{2, 3, 5, 7, 11, 13, ...}で最小値が2なので初期値を2にします。
このように最小値にするのは、最小値からインクリメントしていくと常に網羅的に調べれますよね。
(補足:逆にデクリメントしていくアルゴリズムの場合は最大値を初期値にします。)
いりさいりさ さんが書きました:1。は数学的には整数は無限大の範囲を持っているが、言語に限っては制限がある。その制限とは数を増加させていくと、いずれ負の数としての表記に変わってしまうため。と思ったのですが違うのでしょうか?
unsignedで宣言した場合は負の値になりませんよね、ですのでここは桁あふれが起こるなどにしたほうがよいでしょう。

いりさいりさ

Re: c言語 慣例としてi=0からはじまるのはなぜ?

#7

投稿記事 by いりさいりさ » 9年前

みなさんとても参考になる答えをありがとうございました。これからも機会があればよろしくおねがいします。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: c言語 慣例としてi=0からはじまるのはなぜ?

#8

投稿記事 by ISLe » 9年前

bitter_fox さんが書きました:(補足:逆にデクリメントしていくアルゴリズムの場合は最大値を初期値にします。)
ポインタでデクリメントするときは最大値+1を初期値にしないと言語仕様的に動作保証外になってしまいます。

閉鎖

“C言語何でも質問掲示板” へ戻る