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

for文とbreak文の動作について

このQ&Aのポイント
  • for文でbreak文が実行された場合、for文から抜けます。
  • if文でbreak文が実行された場合、if文から抜けます。
  • for文の影響はif文までです。if文以降はfor文の影響を受けません。

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

  • ベストアンサー
  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

この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などは必ず{}で括るようにしないと可読性が落ちるばかりか、バグの原因にもなります。

startover
質問者

お礼

素早い、そして解りやすい回答ありがとうございました。 ifやforなどは必ず{}で括るようにしないと可読性が落ちるばかりか、バグの原因にもなります。 ご指摘もためになりました。 ありがとうございました。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#3>ループの外にあるbreak文は「なにもしない文」なのでループを中断させません。従って、このfor文は常にiが5になって終了します まるで、デタラメです。 たとえ、利用停止になっても指摘せずにはいられません。

startover
質問者

お礼

どうもです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>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("サーバーが見つかりません"); が実行されます。 なお、 >配列の宣言で最終行も「,」で区切っています は、(個人的な好みは別として)正しい書式です。

startover
質問者

お礼

どうも、回答ありがとうございます。 コードの読み方が解りました、 ありがとうございます。 >配列の宣言で最終行も「,」で区切っています は、(個人的な好みは別として)正しい書式です。 初心者なので解らない所が多く勉強になります。 ありがとうございました。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

>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に初期化さえされていれば、終了時に見付からないとの表示だけは出ます。

startover
質問者

お礼

すばやい回答ありがとうございます。 for文は{ }の手前まで繰り返す とのご指摘でした。 この方法でも読めますね。 if (i==5) printf("サーバーが見つかりません"); は常に成り立つので、常にprintf文が実行されます。 一応質問のプログラムでは、1~4は、サーバーが見つかりません と表示はされないようです。 for文を{ }で囲めばいいのですね。 解りました。 ありがとうございました。

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.1

何かの課題なんでしょうか? >break文に達した時、for文から抜けますか?それとも、if { }から抜けるんですか? break文は、for文やwhile文などのループからの脱出に用います。 結果として、if ( sever == array[i][0] )からも離脱しますけど。 if文で、{}での括りを省略されていますが、文法的には正しくても可読性に劣るので、私の個人的ポリシーに反します。 また、配列の宣言で最終行も「,」で区切っていますし、for文も{}で括ってないですよね? 甘いコンパイラでは通るんでしょうけど。。。。 美しいソースとは思えません。 余計なお世話ですね。

startover
質問者

お礼

素早い回答ありがとうございます。 解説でわかりました。 実は textの例題だったのですが、初心者のためいろいろ勉強になりました。 ありがとうございました。

関連するQ&A

専門家に質問してみよう