6-5. break ループからの脱出
◆無限ループからの脱出
前回までで無限ループが出て来ましたが。開始があり終了がある以上、いつかはループをぬけ出さなくてはなりません。(でないと暴走する)
そのためのキーワードとしてbreakがあります。
break の働きはfor,while文中に break があるとそのループから抜け出します。
しかし、そのまま書いたのではループの意味がないので、if文と併用して使うことが一般的です。(ある条件では抜け出すという使い方)
それではブレイクします!
◇ブレイク!
まず、whileによる無限ループ
////////////////////とあるプログラムの一部////////////////////
while(1){
printf(“終了しますか?”);
scanf(“%c”,&c);
}
//////////////////////////////////////////////////////////////
があります。このままでは何を入力しても無限に質問を繰り返してきます。
このあと、Y か N で答えたらループを脱出し次の処理に移るようにしたいとします。
まず、追加しなければならないのはif文です。
if(c==’Y’||c==’N’)
そして、ここにbreakを入れます。
////////////////////とあるプログラムの一部////////////////////
while(1){
printf(“終了しますか?(Y/N)”);
scanf(“%c”,&c);
if(c==’Y’||c==’N’)break;
}
//////////////////////////////////////////////////////////////
これで、一応まじめに答えることで脱出することができます。
あとは、必要な変数とバッファ処理で完成します。
#include<stdio.h> main() { char c; while(1){ printf("終了しますか?(Y/N)"); scanf("%c%*[^ \n]",&c);getchar(); if(c=='Y'||c=='N')break; } }
for文についても同じことになります。
#include<stdio.h> main() { char c; for(;;){ printf("終了しますか?(Y/N)"); scanf("%c%*[^ \n]",&c);getchar(); if(c=='Y'||c=='N')break; } }
※scanfのバッファ処理についてはNo.061(9/3)にも掲載しています。
実際に行っていいる処理は%*[^ \n]で2文字目以降の文字を無視し、getchar()で最後のCR+LF(改行)をバッファより抜き出しています。
◇スイッチ文を使うときの処理
スイッチ文で使用するとどういう働きになるでしょう。
/* スイッチ文の例 */ #include<stdio.h> main() { char c; printf("0から9の刻印のついたキーを押してエンターキーを"); printf("押してください\n"); /* メールの都合上2行にしています */ scanf("%c",&c); switch(c){ case '0': printf("0のキーが押されました\n");break; case '1': printf("1のキーが押されました\n");break; case '2': printf("2のキーが押されました\n");break; case '3': printf("3のキーが押されました\n");break; case '4': printf("4のキーが押されました\n");break; case '5': printf("5のキーが押されました\n");break; case '6': printf("6のキーが押されました\n");break; case '7': printf("7のキーが押されました\n");break; case '8': printf("8のキーが押されました\n");break; case '9': printf("9のキーが押されました\n");break; default : printf("数字キー以外のキーを押されました\n"); } } /* プログラムの終了 */
スイッチ文の紹介の時このように各行にbreakを付加していました。
文法的にみると別にbreak文がなくても結果は変わらないように思えます。
ですが、実はbreak文がないと次々に以下の文を実行してしまうのです。
それでは、breakをすべて省いてプログラムを実行してみます。
実行例1:(入力に1のキーを押す)
0から9の刻印のついたキーを押してエンターキーを押してください
1
1のキーが押されました
2のキーが押されました
3のキーが押されました
4のキーが押されました
5のキーが押されました
6のキーが押されました
7のキーが押されました
8のキーが押されました
9のキーが押されました
数字キー以外のキーを押されました
実行例2:(入力に5のキーを押す)
0から9の刻印のついたキーを押してエンターキーを押してください
5
5のキーが押されました
6のキーが押されました
7のキーが押されました
8のキーが押されました
9のキーが押されました
数字キー以外のキーを押されました
このようになってしまいます。だからそれぞれ違う処理を行う場合はbreakを用いる事になります。このbreakは無論switch文の脱出を意味します。