- ベストアンサー
ループプログラムでfor( ; ; ){ の; ;てどんなループですか?
- 新たな疑問 for( ; ; ){ ループプログラムでfor( ; ; ){ の; ;てどんなループですか?
- 練習問題 5-18 数値を繰り返して入力し、0が入力されたら入力を止め、それまでの合計を表示するプログラムを作成しなさい。
- 合計は%d
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
・for文では初期値の設定を行わない ・for文ではループを終了する条件を指定しない ・for文ではループのたびに実行する付加実行式を指定しない ということだと思いますが・・・。 あくまでも ”for文では” 行わないということで。
その他の回答 (7)
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
>ループプログラムでfor( ; ; ){ の; ;てどんなループですか? 例えば、 ---------- #include <stdio.h> int main(void){ int i; for(i=0; i<10; i++){ printf("%d ", i); } printf("\n"); return 0; } ---------- という0から9まで出力するプログラムを取り上げる。 C言語は構造化言語であるから、for()文というのがあって繰り返して { } の中の実行文printf()を繰り返して行うことができる。 では、実際の機械語レベルではどうなのであろうか? 機械語、すなわち、アセンブラはそのような構造化言語構造を持っていないから、1行1行が一つの処理を行うことになる。 処理はあくまでも一行なのでgoto文を使うことになる(実際は相対ジャンプ)。 それは、一行で行う goto文を使うと上記 for(処理(1); 処理(2); 処理(3))文は次のように記述できる。 ---------- #include <stdio.h> int main(void){ int i; i = 0; //処理(1) HEAD: if(!(i < 10)) goto TAIL; //処理(2) printf("%d ", i); i++; //処理(3) goto HEAD; TAIL: printf("\n"); return 0; } ---------- そこで、処理(1),(2),(3)を省いてfor( ; ; )文にするとそれは ---------- #include <stdio.h> int main(void){ int i=0; //無限ループ時の出力を0にあえて統一 ; //処理(1) HEAD: ; //処理(2) printf("%d ", i); //実行文 ; //処理(3) goto HEAD; TAIL: printf("\n"); return 0; } ---------- と書ける(コンパイラがアセンブラ展開する)。 これをコンパイルすると、実行文 printf()を繰り返す無限ループとなる(コンパイル、実行すると無限ループとなるので ctrl+c で強制終了のこと)。 for( ; ; )は、{ } で囲まれた実行文を無限に繰り返す。
- hanabutako
- ベストアンサー率54% (492/895)
> 空がなぜ真と決まっているのでしょうか?これを論理的に説明している文を読んだ記憶がありません。 for文のexpression-2についてはそう決まっているからです。 C99の規格には、 for (clause-1; expression-2; expression-3) statement の clause-1, expression-3は省略可能であり、expression-2が省略された場合はゼロではない定数と入れ替えられる と書いてあります。 www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf 6.8.5.3 The for statementの2節。
- TT414
- ベストアンサー率18% (72/384)
≻です。言語仕様を確認すると、「何にもない」というのも「式」です。 とありますが式を省略できるのは「式文」「for文」「return文」だけです。 if、switch、caseラベル、do、whileでは式を省略できません。
- KAZUMI2003
- ベストアンサー率37% (77/208)
回答でなくて申し訳ないですが、ちょっと興味深いので、書かせて頂きます。 No.2の方がサラリと言っていますが、 >空だから「偽」にならない 空がなぜ真と決まっているのでしょうか?これを論理的に説明している文を読んだ記憶がありません。 私の遥かな遠い記憶では、「for(;;)は無限ループ」と問答無用に決まっていた気がするのですが。
- toshiyuk
- ベストアンサー率41% (36/87)
while(true) { ..... とコーディングした方が分かりやすいよね。
- kmee
- ベストアンサー率55% (1857/3366)
http://okwave.jp/qa/q6846430.html でも書いたように、 for(式1;式2;式3)で ・ループを開始する前に式1を実行 ・式2の値を評価して「真」ならループを実行 ・1回ループするたびに式3を実行 です。言語仕様を確認すると、「何にもない」というのも「式」です。 ・ループを開始する前に式1を実行→空だから何もしない ・式2の値を評価して「真」ならループを実行→空だから「偽」にならない ・1回ループするたびに式3を実行→空だから何もしない となり、無限ループになります。 前の回答で「間違えると、無限ループになる場合もある」と書きましたが、これは積極的に無限ループを作っています。
- bajutsu
- ベストアンサー率20% (139/693)
見たまんまなんだけど。 初期化しない、条件判定しない、カウントアップ(ダウン)もしませんよってだけ。 いわゆる無限ループ。 抜けるのは、forの中にあるbreakで。
お礼
ご回答ありがとうございました。 皆様のご回答をすべて読んで、どうしても私の知識で 解釈ができないのは飛ばして、私の知識内で試してみました。 A;「あくまでも ”for文では” 行わないということで。」 でヒントを得ました。forでループはするが、条件を指定しないと解釈しました。 100%理解はしていませんが、沢山問題を説くことにより理解を深めていきたいと思います。 以下実際にプログラムを動かしてみました。 入力した数字2 2 2 2 と入力したところ 表示された文字 合計は2合計は4合計は6合計は8