- ベストアンサー
C言語での関数forについて
- C言語の基本的なことで躓いてしまって自分でいくら考えてみても、わかりません・・。よければ教えて頂けないでしょうか。
- 上のプログラムを実行すると”正解は5でした”と出るのは分かります。しかし”countは今4です”までしか出ないのが何故だか分かりません。ここは5ではないんでしょうか?
- 私は何か根本的なことが分かってないのでしょうか・・。教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 C言語のマニュアルで、forのところを読まれたら、わかると思いますが。 上記にかかれているプログラムのfor文の処理される順番は (1)countに0をいれる (2)count < 5 の条件文を満たしているかチェックする(今はcountは0) (3)条件文を満たしているのでprint文を実行する(countは今0です を表示) (4)countに1をたす(countは1となる) (5)count < 5 の条件文を満たしているかチェックする(今はcountは1) (6)条件文を満たしているのでprint文を実行する(countは今1です を表示) (7)countに1をたす(countは2となる) ・ ・ 繰り返し行う ・ ・ ・countに1をたす(countは4となる) ・count < 5 の条件文を満たしているかチェックする(今はcountは4) ・条件文を満たしているのでprint文を実行する(countは今4です を表示) ・countに1をたす(countは5となる) ・count < 5 の条件文を満たしているかチェックする(今はcountは5) ・条件文を満たしていないので、forループを抜ける。 次の処理を実行する。 ・ ・ なので、for文を抜けた時点でcountは5になっています。 なので、「正解は5でした」と表示されます。 しかし、for文内の処理が実行されるのは、count<5の間なので、 「countは今4です」までしかでないのです。 あと、forは関数ではありません。ループ文です。 まずは、基本を身に付けるようにがんばって勉強してくださいね。
その他の回答 (6)
> (count = 0; count < 5; count++)と先にかいてあって、その後にprint文がきてるので > 先にcountに1をたしてから、print文を実行するとどうしても思ってしまうんですが > なぜcount++はprint文の後に来ないのでしょうか・・ まず while 文によるループが基本であると考えてください。 つまり、ある条件が成り立っている間、処理をし続けると いうのが普通のパターンです。 もっと極端な話をすれば、while 文があれば、for 文は必要 ないのです。全ての for 文は、while 文で書き換えること ができますから。 では、なぜ for 文があるかというと、やはりカウンタを使 ったループを使いたい場合が多いからではないでしょうか。 「ある回数だけループさせたい」という場合、毎回 while 文でカウンタ変数を使って書いていると、カウンタ変数を カウントアップする個所を同じように毎回ループ内に書か なければいけません。 それより for 文を使えば、カウンタ変数のカウントアップ という、ループ内処理には関係ない命令をループ内に書かな くても済みますよね。 for ループは while ループの特殊な形だと思えばよいと思 います。
お礼
ありがとうございます。なんだか難しいです。
- korei
- ベストアンサー率30% (22/72)
koreiです。補足しますね。 for文は、 for(初期化;条件文;式){} と記述します。 実行の順番が、 (1)初期化(最初の";"で区切られたところまで) (2)条件文(";~;"まで) (3){}の中 (4)式(最後の";"以降) (5)条件文(";~;"まで) (6){}の中 (7)式(最後の";"以降) ・・・ と決まっています。 即ち、 for(最初だけ;実行(1);実行(3)){ 実行(2) } となり、実行(1)~実行(3)の順番で、条件文(実行(1))が満たされている間、 ループする訳です。 なので、上記のプログラムでは、count++を実行してから、print文の実行にはならない訳ですね。 初級向けのC言語のマニュアルのfor文のところを見てみましょう。 もっと、わかりやすく載っていると思いますよ。 では、勉強をがんばってください。
お礼
ありがとうございます。そういう順番だとして覚えてしまえばいいんですね。
- toysmith
- ベストアンサー率37% (570/1525)
「関数for」と言う段階で“根本的なことが分かってない”が証明されています。 forは“関数”ではありません。 また、C言語に“命令”という概念はありません。 forは“制御文を示すキーワード”です。 forループを分解するとこういうカンジです。 for (i = 0 ; i < 5 ; i++) { printf("%d", i) ; } printf("終わり") ; これは 1.iに0をいれる 2.iが5より小さければ3以降、違ったら6以降を実行 3.printf("%d", i)関数の実行 4.iをカウントアップする 5.2に戻る 6.printf("終わり")関数の実行 whileループに書きなおすと i = 0 ; while (i < 5) { printf("%d", i) ; i++ ; } printf("終わり") ; iが5の時にループ内を通らない理由はわかると思います。
お礼
ありがとうございます
- MYLINE
- ベストアンサー率40% (10/25)
KOH_daさんの回答ですが、 「2周目以降の判定の直前に行なわれます。」と書いてありますが、 1つの構文で、たとえばループの構文で1周目は処理しない、2周目以降は処理するという風に違う処理をする事は有りません。 ですから、 「for命令のcount++の処理は1周目、2周目、・・・の最後に処理されます。」 という風に理解する方がよろしいと思います。
お礼
ありがとうございます
- KOH_da
- ベストアンサー率31% (161/506)
for命令はループに入る前に判定を行ないます。 またcount++というのは、2周目以降の判定の直前に行なわれます。 だから、countが5になった時にはループ内を通らずに、 処理を抜けてうため「countは4です」とは表示されません。 判定を最後に行ないたい場合は、do~whileという命令を使うか、 無限ループを作り、if(条件)break;というのを、 ループの最後の方に入れることが多いです。
お礼
ありがとうございます
- route156
- ベストアンサー率85% (93/109)
for 文を while 文に書き換えてみるとわかりやすいと思います。 次の while 文は、ご質問の for 文と同じ動作をします。count++ が実行されるタイミングに注意してみてください。 count = 0; while (count < 5) { printf("count は今 %d です\n", count); count++; } 例えば、今 count が 4 であるとします。 printf で“count は今 4 です”と表示されます。 count++ で count が 5 になります。 しかし、次に while で (count < 5) の条件を満たさないので、printf や count++ は実行されずに while ループを抜けます。 “count は今 5 です”と表示されないのはこのためです。 ループを抜けたとき count は 5 になっていますから、“正解は 5 でした”と表示されます。 count++ は (count < 5) の評価の直前に実行されると考えてください。
お礼
ありがとうございます
お礼
ありがとうございます!すごくわかりやすかったです。 あの,条件文を満たしていたら、countに1を足し、print文を実行する。 という順番にならないのは何故ですか (count = 0; count < 5; count++)と先にかいてあって、その後にprint文がきてるので 先にcountに1をたしてから、print文を実行するとどうしても思ってしまうんですが なぜcount++はprint文の後に来ないのでしょうか・・