dポイントプレゼントキャンペーン実施中!

 ループプログラムでfor( ; ; ){ の; ;てどんなループですか?
以下参考にされてください。
練習問題 5-18
数値を繰り返して入力し、0が入力されたら入力を止め、それまでの合計を表示するプログラムを作成しなさい。
________________________________________
int sum = 0;
int value;

for( ; ; ){
scanf( "%d", &value );

if( value == 0 )
break;

sum += value;
}

printf( "合計は%d", sum );

A 回答 (8件)

・for文では初期値の設定を行わない


・for文ではループを終了する条件を指定しない
・for文ではループのたびに実行する付加実行式を指定しない

ということだと思いますが・・・。

あくまでも ”for文では” 行わないということで。
    • good
    • 0
この回答へのお礼

 ご回答ありがとうございました。
  皆様のご回答をすべて読んで、どうしても私の知識で
  解釈ができないのは飛ばして、私の知識内で試してみました。
 
A;「あくまでも ”for文では” 行わないということで。」
 でヒントを得ました。forでループはするが、条件を指定しないと解釈しました。

100%理解はしていませんが、沢山問題を説くことにより理解を深めていきたいと思います。
 以下実際にプログラムを動かしてみました。
入力した数字2 2 2 2 と入力したところ 表示された文字

 合計は2合計は4合計は6合計は8

お礼日時:2011/08/10 07:16

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

> 空がなぜ真と決まっているのでしょうか?これを論理的に説明している文を読んだ記憶がありません。



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節。
    • good
    • 0

≻です。

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

回答でなくて申し訳ないですが、ちょっと興味深いので、書かせて頂きます。



No.2の方がサラリと言っていますが、
>空だから「偽」にならない

空がなぜ真と決まっているのでしょうか?これを論理的に説明している文を読んだ記憶がありません。
私の遥かな遠い記憶では、「for(;;)は無限ループ」と問答無用に決まっていた気がするのですが。
    • good
    • 0

while(true) { .....


とコーディングした方が分かりやすいよね。
    • good
    • 0

http://oshiete.goo.ne.jp/qa/6846430.html
でも書いたように、

for(式1;式2;式3)で
・ループを開始する前に式1を実行
・式2の値を評価して「真」ならループを実行
・1回ループするたびに式3を実行

です。言語仕様を確認すると、「何にもない」というのも「式」です。

・ループを開始する前に式1を実行→空だから何もしない
・式2の値を評価して「真」ならループを実行→空だから「偽」にならない
・1回ループするたびに式3を実行→空だから何もしない

となり、無限ループになります。
前の回答で「間違えると、無限ループになる場合もある」と書きましたが、これは積極的に無限ループを作っています。
    • good
    • 0

見たまんまなんだけど。



初期化しない、条件判定しない、カウントアップ(ダウン)もしませんよってだけ。
いわゆる無限ループ。

抜けるのは、forの中にあるbreakで。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!