-PR-
解決
済み

C言語での関数forについて

  • 困ってます
  • 質問No.44960
  • 閲覧数379
  • ありがとう数9
  • 気になる数0
  • 回答数7
  • コメント数0

お礼率 54% (23/42)

C言語の基本的なことで躓いてしまって
自分でいくら考えてみても、わかりません・・。
よければ教えて頂けないでしょうか。
-----
{
int count;
for (count = 0; count < 5; count++) {
printf("countは今%dです\n", count );
}
if (count == 4) {
printf("正解は4でした\n");
} else if (count == 5) {
printf("正解は5でした\n");
} else {
printf("正解は4でも5でもありませんでした\n");
}
}
----------
上のプログラムを実行すると”正解は5でした”と出るのは分かります。
しかし”countは今4です”までしか出ないのが何故だか分かりません。
ここは5ではないんでしょうか?
私は何か根本的なことが分かってないのでしょうか・・。
教えてください。
通報する
  • 回答数7
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.5
レベル9

ベストアンサー率 30% (22/72)

こんにちは。
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は関数ではありません。ループ文です。
まずは、基本を身に付けるようにがんばって勉強してくださいね。
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます!すごくわかりやすかったです。

あの,条件文を満たしていたら、countに1を足し、print文を実行する。
という順番にならないのは何故ですか
(count = 0; count < 5; count++)と先にかいてあって、その後にprint文がきてるので
先にcountに1をたしてから、print文を実行するとどうしても思ってしまうんですが
なぜcount++はprint文の後に来ないのでしょうか・・
投稿日時 - 2001-02-27 03:53:05
-PR-
-PR-

その他の回答 (全6件)

  • 回答No.1
レベル10

ベストアンサー率 85% (93/109)

 for 文を while 文に書き換えてみるとわかりやすいと思います。  次の while 文は、ご質問の for 文と同じ動作をします。count++ が実行されるタイミングに注意してみてください。 count = 0; while (count < 5) {  printf("count は今 %d です\n", count);  count++; } ...続きを読む
 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) の評価の直前に実行されると考えてください。
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます
投稿日時 - 2001-02-27 03:54:05


  • 回答No.2
レベル12

ベストアンサー率 31% (161/506)

for命令はループに入る前に判定を行ないます。 またcount++というのは、2周目以降の判定の直前に行なわれます。 だから、countが5になった時にはループ内を通らずに、 処理を抜けてうため「countは4です」とは表示されません。 判定を最後に行ないたい場合は、do~whileという命令を使うか、 無限ループを作り、if(条件)break;というのを、 ループの最後の方に入れることが ...続きを読む
for命令はループに入る前に判定を行ないます。
またcount++というのは、2周目以降の判定の直前に行なわれます。
だから、countが5になった時にはループ内を通らずに、
処理を抜けてうため「countは4です」とは表示されません。

判定を最後に行ないたい場合は、do~whileという命令を使うか、
無限ループを作り、if(条件)break;というのを、
ループの最後の方に入れることが多いです。
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます
投稿日時 - 2001-02-27 03:54:31
  • 回答No.3
レベル9

ベストアンサー率 40% (10/25)

KOH_daさんの回答ですが、 「2周目以降の判定の直前に行なわれます。」と書いてありますが、 1つの構文で、たとえばループの構文で1周目は処理しない、2周目以降は処理するという風に違う処理をする事は有りません。 ですから、 「for命令のcount++の処理は1周目、2周目、・・・の最後に処理されます。」 という風に理解する方がよろしいと思います。 ...続きを読む
KOH_daさんの回答ですが、
「2周目以降の判定の直前に行なわれます。」と書いてありますが、
1つの構文で、たとえばループの構文で1周目は処理しない、2周目以降は処理するという風に違う処理をする事は有りません。
ですから、
「for命令のcount++の処理は1周目、2周目、・・・の最後に処理されます。」
という風に理解する方がよろしいと思います。
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます
投稿日時 - 2001-02-27 03:54:59
  • 回答No.4
レベル13

ベストアンサー率 37% (570/1525)

「関数for」と言う段階で“根本的なことが分かってない”が証明されています。 forは“関数”ではありません。 また、C言語に“命令”という概念はありません。 forは“制御文を示すキーワード”です。 forループを分解するとこういうカンジです。 for (i = 0 ; i < 5 ; i++) {   printf("%d", i) ; } print ...続きを読む
「関数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の時にループ内を通らない理由はわかると思います。
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます
投稿日時 - 2001-02-27 03:55:21
  • 回答No.6
レベル9

ベストアンサー率 30% (22/72)

koreiです。補足しますね。 for文は、 for(初期化;条件文;式){}  と記述します。 実行の順番が、 (1)初期化(最初の";"で区切られたところまで) (2)条件文(";~;"まで) (3){}の中 (4)式(最後の";"以降) (5)条件文(";~;"まで) (6){}の中 (7)式( ...続きを読む
koreiです。補足しますね。

for文は、
for(初期化;条件文;式){} 
と記述します。
実行の順番が、
(1)初期化(最初の";"で区切られたところまで)
(2)条件文(";~;"まで)
(3){}の中
(4)式(最後の";"以降)
(5)条件文(";~;"まで)
(6){}の中
(7)式(最後の";"以降)
・・・
と決まっています。

即ち、
for(最初だけ;実行(1);実行(3)){
   実行(2)

となり、実行(1)~実行(3)の順番で、条件文(実行(1))が満たされている間、
ループする訳です。

なので、上記のプログラムでは、count++を実行してから、print文の実行にはならない訳ですね。


初級向けのC言語のマニュアルのfor文のところを見てみましょう。
もっと、わかりやすく載っていると思いますよ。

では、勉強をがんばってください。
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます。そういう順番だとして覚えてしまえばいいんですね。
投稿日時 - 2001-02-28 04:35:18
  • 回答No.7

> (count = 0; count &lt; 5; count++)と先にかいてあって、その後にprint文がきてるので > 先にcountに1をたしてから、print文を実行するとどうしても思ってしまうんですが > なぜcount++はprint文の後に来ないのでしょうか・・ まず while 文によるループが基本であると考えてください。 つまり、ある条件が成り立っている間、処理 ...続きを読む
> (count = 0; count &lt; 5; count++)と先にかいてあって、その後にprint文がきてるので
> 先にcountに1をたしてから、print文を実行するとどうしても思ってしまうんですが
> なぜcount++はprint文の後に来ないのでしょうか・・

まず while 文によるループが基本であると考えてください。
つまり、ある条件が成り立っている間、処理をし続けると
いうのが普通のパターンです。
もっと極端な話をすれば、while 文があれば、for 文は必要
ないのです。全ての for 文は、while 文で書き換えること
ができますから。
では、なぜ for 文があるかというと、やはりカウンタを使
ったループを使いたい場合が多いからではないでしょうか。
「ある回数だけループさせたい」という場合、毎回 while
文でカウンタ変数を使って書いていると、カウンタ変数を
カウントアップする個所を同じように毎回ループ内に書か
なければいけません。
それより for 文を使えば、カウンタ変数のカウントアップ
という、ループ内処理には関係ない命令をループ内に書かな
くても済みますよね。
for ループは while ループの特殊な形だと思えばよいと思
います。
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます。なんだか難しいです。
投稿日時 - 2001-02-28 04:36:14
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ