始めての質問失礼します。
次のC言語に関する慣例(javaやfortran77と比較した際の特徴)について色々な観点から調べなさい。
1. 慣例として i=0 からまわすのはなぜか?一方でi=1からがあまり使われないのはなぜか?
2. 慣例としてi<10 にするのはなぜか?一方でi<=9 を余り見ないのはなぜか?
(計算機システムIやIIで学んだ)機械語ではどう書かれるかを考えた際の観点も含めて構わない。
これを調べたのですが、よくわかりませんでした;;
1。は数学的には整数は無限大の範囲を持っているが、言語に限っては制限がある。その制限とは数を増加させていくと、いずれ負の数としての表記に変わってしまうため。
と思ったのですが違うのでしょうか?
ご指導ご鞭撻のほどよろしくおねがいします。
c言語 慣例としてi=0からはじまるのはなぜ?
Re: c言語 慣例としてi=0からはじまるのはなぜ?
「ご指導ご鞭撻」といわれるとなにも書けないので、自分の解釈を書きます。
配列を扱う時に使用する事が多いので、だと勝手に解釈しています。
たとえば、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;
がわかりやすいです自分は。
設問では、機械語レベルに意味がありげなニュアンスですが
もしあったとしても慣例として使っている自分にしてみれば
使わない理由にはなりません。
配列を扱う時に使用する事が多いので、だと勝手に解釈しています。
たとえば、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;
がわかりやすいです自分は。
設問では、機械語レベルに意味がありげなニュアンスですが
もしあったとしても慣例として使っている自分にしてみれば
使わない理由にはなりません。
Re: c言語 慣例としてi=0からはじまるのはなぜ?
すでに、答えは出てると思いますよ。
慣例として使われているのですから、何故かと聞かれればそれが慣例となっているからです。 としか答えようが無いわけですが。
多くの場合はそれが都合がいいからでは無いでしょうか。
例えば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ですが。 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。は数学的には整数は無限大の範囲を持っているが、言語に限っては制限がある。その制限とは数を増加させていくと、いずれ負の数としての表記に変わってしまうため。
Re: c言語 慣例としてi=0からはじまるのはなぜ?
> 西暦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
> 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
- 登録日時: 13年前
- 住所: 大阪府
Re: c言語 慣例としてi=0からはじまるのはなぜ?
0から始めるのを慣例の一言で済ますのではなく、もうちょっと合理的に考えてみましょう。いりさいりさ さんが書きました:始めての質問失礼します。
次のC言語に関する慣例(javaやfortran77と比較した際の特徴)について色々な観点から調べなさい。
1. 慣例として i=0 からまわすのはなぜか?一方でi=1からがあまり使われないのはなぜか?
配列へのアクセスは、0からですが、アルゴリズムによってはそうでないものもありますよね。
たとえば、素数を求めるプログラムでは2からループを始めますよね。
では、ループの初期値(i)はなにで決まるのかというと、ループ内のiの値の集合の中の最小値です。
例)
配列へのアクセスの際のiの集合は、{0, 1, 2, ..., max-2, max-1}で最小値が0なので初期値を0にします。
素数の集合は、{2, 3, 5, 7, 11, 13, ...}で最小値が2なので初期値を2にします。
このように最小値にするのは、最小値からインクリメントしていくと常に網羅的に調べれますよね。
(補足:逆にデクリメントしていくアルゴリズムの場合は最大値を初期値にします。)
unsignedで宣言した場合は負の値になりませんよね、ですのでここは桁あふれが起こるなどにしたほうがよいでしょう。いりさいりさ さんが書きました:1。は数学的には整数は無限大の範囲を持っているが、言語に限っては制限がある。その制限とは数を増加させていくと、いずれ負の数としての表記に変わってしまうため。と思ったのですが違うのでしょうか?
Re: c言語 慣例としてi=0からはじまるのはなぜ?
ポインタでデクリメントするときは最大値+1を初期値にしないと言語仕様的に動作保証外になってしまいます。bitter_fox さんが書きました:(補足:逆にデクリメントしていくアルゴリズムの場合は最大値を初期値にします。)