• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:新たな疑問 for( ; ; ){)

ループプログラムでfor( ; ; ){ の; ;てどんなループですか?

このQ&Aのポイント
  • 新たな疑問 for( ; ; ){ ループプログラムでfor( ; ; ){ の; ;てどんなループですか?
  • 練習問題 5-18 数値を繰り返して入力し、0が入力されたら入力を止め、それまでの合計を表示するプログラムを作成しなさい。
  • 合計は%d

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

  • ベストアンサー
  • neko1963
  • ベストアンサー率49% (127/258)
回答No.5

・for文では初期値の設定を行わない ・for文ではループを終了する条件を指定しない ・for文ではループのたびに実行する付加実行式を指定しない ということだと思いますが・・・。 あくまでも ”for文では” 行わないということで。

gogatunijyuku
質問者

お礼

 ご回答ありがとうございました。   皆様のご回答をすべて読んで、どうしても私の知識で   解釈ができないのは飛ばして、私の知識内で試してみました。   A;「あくまでも ”for文では” 行わないということで。」  でヒントを得ました。forでループはするが、条件を指定しないと解釈しました。 100%理解はしていませんが、沢山問題を説くことにより理解を深めていきたいと思います。  以下実際にプログラムを動かしてみました。 入力した数字2 2 2 2 と入力したところ 表示された文字  合計は2合計は4合計は6合計は8

その他の回答 (7)

回答No.8

>ループプログラムで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( ; ; )は、{ } で囲まれた実行文を無限に繰り返す。

回答No.7

> 空がなぜ真と決まっているのでしょうか?これを論理的に説明している文を読んだ記憶がありません。 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)
回答No.6

≻です。言語仕様を確認すると、「何にもない」というのも「式」です。 とありますが式を省略できるのは「式文」「for文」「return文」だけです。 if、switch、caseラベル、do、whileでは式を省略できません。

回答No.4

回答でなくて申し訳ないですが、ちょっと興味深いので、書かせて頂きます。 No.2の方がサラリと言っていますが、 >空だから「偽」にならない 空がなぜ真と決まっているのでしょうか?これを論理的に説明している文を読んだ記憶がありません。 私の遥かな遠い記憶では、「for(;;)は無限ループ」と問答無用に決まっていた気がするのですが。

  • toshiyuk
  • ベストアンサー率41% (36/87)
回答No.3

while(true) { ..... とコーディングした方が分かりやすいよね。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

http://okwave.jp/qa/q6846430.html でも書いたように、 for(式1;式2;式3)で ・ループを開始する前に式1を実行 ・式2の値を評価して「真」ならループを実行 ・1回ループするたびに式3を実行 です。言語仕様を確認すると、「何にもない」というのも「式」です。 ・ループを開始する前に式1を実行→空だから何もしない ・式2の値を評価して「真」ならループを実行→空だから「偽」にならない ・1回ループするたびに式3を実行→空だから何もしない となり、無限ループになります。 前の回答で「間違えると、無限ループになる場合もある」と書きましたが、これは積極的に無限ループを作っています。

  • bajutsu
  • ベストアンサー率20% (139/693)
回答No.1

見たまんまなんだけど。 初期化しない、条件判定しない、カウントアップ(ダウン)もしませんよってだけ。 いわゆる無限ループ。 抜けるのは、forの中にあるbreakで。