- ベストアンサー
for文とbreak文の動作について
- for文でbreak文が実行された場合、for文から抜けます。
- if文でbreak文が実行された場合、if文から抜けます。
- for文の影響はif文までです。if文以降はfor文の影響を受けません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
このfor文は直後のif文を繰り返します。 ifの条件が真の時、printfで出力の後、breakでfor文から脱出します。(A) ifの条件が偽の時、iをインクリメントし、forの条件を調べます。 forの条件が偽の時、for文から脱出します。(B) for文から脱出後、次のif文を実行します。 (A)の方法で脱出した場合、iは5未満の筈なのでprintfは実行されません。 (B)の方法で脱出した場合、iは5なのでprintfが実行されます(severの値は関係ありません) ifやforなどは必ず{}で括るようにしないと可読性が落ちるばかりか、バグの原因にもなります。
その他の回答 (4)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#3>ループの外にあるbreak文は「なにもしない文」なのでループを中断させません。従って、このfor文は常にiが5になって終了します まるで、デタラメです。 たとえ、利用停止になっても指摘せずにはいられません。
お礼
どうもです。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>break文に達した時、for文から抜けますか?それとも、if { }から抜けるんですか? for から抜けます >for文はどこまで影響下にありますか? >if ( i==5 ) printf ("サーバーが見つかりません"); まででしょうか? その前までです。 for にif ブロックが1つある形です。 >if ( i == 5 ) で5なら、実行としていますが、 >6,や,8など5 以外でも、サーバーが見つかりませんと if文が実行される見たいですが、なぜですか? i==6 としたなら、実行されません。 入力した値が6 とか8 なら、 for ループが終了した段階でi は、5 になっていますので、 この場合、指定した値が見つからない場合、 >if (i==5) printf("サーバーが見つかりません"); が実行されます。 なお、 >配列の宣言で最終行も「,」で区切っています は、(個人的な好みは別として)正しい書式です。
お礼
どうも、回答ありがとうございます。 コードの読み方が解りました、 ありがとうございます。 >配列の宣言で最終行も「,」で区切っています は、(個人的な好みは別として)正しい書式です。 初心者なので解らない所が多く勉強になります。 ありがとうございました。
- chie65536
- ベストアンサー率41% (2512/6032)
>break文に達した時、for文から抜けますか?それとも、if { }から抜けるんですか? ご質問の例では、このbreak文は何もしません。 >for文はどこまで影響下にありますか? if ( sever == array[i][0] ) までです。このif文の判定式のすぐ右の「{」以降は「if文とは別ステートメント」で、for文の影響の外です。 ここで注意しなければならないのは「if文は判定式までが1つのステートメントで、条件成立時に実行されるステートメントは、if文とは別のステートメント」だと言う事。 従って、if文の判定式が成立した場合に実行される「{」から「}」の部分はfor文のループ部分の外にあると言う事になり、言い替えれば「break文はなにもしない文」になります。 >と if文が実行される見たいですが、なぜですか? ループの外にあるbreak文は「なにもしない文」なのでループを中断させません。従って、このfor文は常にiが5になって終了します。つまり、 if (i==5) printf("サーバーが見つかりません"); は常に成り立つので、常にprintf文が実行されます。 ソースコードを以下のように修正しましょう。 int server; int i; printf("番号を入力してください"); scanf("%d",&sever); for ( i=0 ; i<5 ; i++ ) { if ( sever == array[i][0] ) { printf( "%d 番には, %d 人います。\n",sever,array[i][1]); break; } } if (i==5) printf("サーバーが見つかりません"); return 0; こうすると、break文は「for文のループ内」に置かれる為、break文によりループを抜けます。 なお、ループ終了後に「iが5かどうか?」で「1度もbreak文の所を通らなかった事」を判断していますが、これは余り良い方法とは言えません。 このfor文はiが6でも7でもループを終了するので、どこかにiの値を強制的に変更するコードを追加してしまうと、正しく判断できなくなります。 ソースを以下のように変更しましょう。 int server; int i; bool found; printf("番号を入力してください"); scanf("%d",&sever); found = false; for ( i=0 ; i<5 ; i++ ) { if ( sever == array[i][0] ) { printf( "%d 番には, %d 人います。\n",sever,array[i][1]); found = true; break; } } if (!found) printf("サーバーが見つかりません"); return 0; これなら、まかり間違ってfor文が1回も実行されなかったとしても、foundの値がfalseに初期化さえされていれば、終了時に見付からないとの表示だけは出ます。
お礼
すばやい回答ありがとうございます。 for文は{ }の手前まで繰り返す とのご指摘でした。 この方法でも読めますね。 if (i==5) printf("サーバーが見つかりません"); は常に成り立つので、常にprintf文が実行されます。 一応質問のプログラムでは、1~4は、サーバーが見つかりません と表示はされないようです。 for文を{ }で囲めばいいのですね。 解りました。 ありがとうございました。
- trajaa
- ベストアンサー率22% (2662/11921)
何かの課題なんでしょうか? >break文に達した時、for文から抜けますか?それとも、if { }から抜けるんですか? break文は、for文やwhile文などのループからの脱出に用います。 結果として、if ( sever == array[i][0] )からも離脱しますけど。 if文で、{}での括りを省略されていますが、文法的には正しくても可読性に劣るので、私の個人的ポリシーに反します。 また、配列の宣言で最終行も「,」で区切っていますし、for文も{}で括ってないですよね? 甘いコンパイラでは通るんでしょうけど。。。。 美しいソースとは思えません。 余計なお世話ですね。
お礼
素早い回答ありがとうございます。 解説でわかりました。 実は textの例題だったのですが、初心者のためいろいろ勉強になりました。 ありがとうございました。
お礼
素早い、そして解りやすい回答ありがとうございました。 ifやforなどは必ず{}で括るようにしないと可読性が落ちるばかりか、バグの原因にもなります。 ご指摘もためになりました。 ありがとうございました。