- ベストアンサー
C言語学習2日目の超初心者の質問:for文の動作について
- C言語学習2日目の超初心者が、for文で作成したプログラムの動作について質問です。
- プログラムを実行すると、最後に表示される数字がなぜ3:0になるのか疑問です。
- また、for文が終わった後のprintfの中身の数字は、最後に処理された数字なのでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
jはこの際関係ないので for(i=0;i<3;i++){ printf("%d\n" , i); } printf("%d\n" , i); //※ ということですね。 for(){}がやっていることはiの値を{}の最後にインクリメントして、{}の最初のところで評価するという動作です。したがってiの値は0,1,2,3となったところでi<3の条件に合わなくなってループから抜けます。iはこの関数のどこからでも参照されてしまうので、forループを抜けた後でも変更された値、つまり3を保持しています。なので//※のところのprintfでも3が表示されるのです。 この辺は「変数のスコープ」という話題になります。 なおC++ですともうちょっと別の書き方をしてforループ内だけで有効な変数を定義することもできます。
その他の回答 (2)
- yshr9442
- ベストアンサー率43% (10/23)
補足説明をしようと思ったのですが、 No1,No2の回答者様ので十分ですね。 for文の中が実行されているのは、条件が当てはまるときだけですからね。 もしもiが0,1,2しか入らないならば、永久にfor文から抜け出せなくなってしまいます。 iが+1されて条件判定し、i=3になって初めて条件から抜け出し最後のprintfでi=3,j=0が出力されるということです。
お礼
なるほど。とりあえず2を超えて3まで行ってしまうのですね。 そして3が条件と合わないのでループの外に飛び出すという考えなのですね。 ありがとうございました。
- mac_res
- ベストアンサー率36% (568/1571)
for文を等価なwhile文に書き換えてみればはっきりします。 #include <stdio.h> int main(void) { int i; int j; i = 0; while ( i < 2 ) { scanf("%d", &j); printf("%d:%d\n", i, j); i++; } printf("%d:%d", i, j); return 0; } ループを抜けてもiのスコープは有効で3になっています。
お礼
ありがとうございます。 whileでも同じなのですね。 iは2未満なので3なんか入るはずがない! と思っていましたが、 理解の仕方が間違っていたんですね。 今後とも是非宜しくお願いします。
お礼
>iの値は0,1,2,3となったところでi<3の条件に合わなくなってループから抜けます そういう考えなのですね。 最後の3が出てきたら、forの{}中のprintfは飛ばされて{}から3が抜け出すと考えればいいのですね。 今後ともご教授願います。 ありがとうございました。