while文制御
もうひとつのループ制御文
C言語ではfor以外にもループステートメントが存在します
それがwhile制御文です。for文に比べて簡素なので無限ループなどにはこちらが使われます
基本的にはwhileでなければ解決できないというループ制御は存在しないでしょう
for文だけでもプログラムは作れます、が、やはりそのプログラムに適したループ制御を使うべきです
whileは真である間、指定ステートメントを繰り返すステートメントです
while (条件式) statement;
このwhileもファイル操作などの高度なプログラムになると多用されます
ただし、whileにはforのようなカウンターがないのでそれはプログラマがステートメントで指定する必要があります
たとえば次のプログラムを見てください
#include <stdio.h>
int main()
{
while (1) printf("繰り返してます…\r");
return 0;
}
この場合、whileに与えられている式は1、つまり真(True)です
ステートメントで強制的に抜け出すような命令はありません、つまり無限ループとなっています
注) 無限ループなのでプログラムを終了させられません。[Ctrl + C] などで強制的にアプリケーションを終了させてください
ループから抜け出すには、ループ内で強制的に抜け出すか
もしくはループ内で、ループ条件になっている値を変更してwhileに偽を渡すようにすることです
#include <stdio.h>
int main()
{
int count = 0;
while (1) {
printf("/");
if (count == 25) printf("\n\t猫耳愛!\n");
if (count == 50) break;
count++;
}
printf("\nループを抜けました、プログラムを終了します");
return 0;
}
switchでやったbreakステートメントを使って抜け出しています
breakは現在のループから離脱するステートメントでしたね
次は、もっとも一般的な方法でループを抜けてみましょう
これは、for同様にwhileの式で上限を決めてループの中でインクリメントを使います
#include <stdio.h>
int main()
{
int count = 0;
while (count <= 50) {
printf("/");
if (count == 25) printf("\n\t猫耳愛!\n");
count++;
}
printf("\nループを抜けました、プログラムを終了します");
return 0;
}
通常は後者のようにwhileの条件式が偽になるようにループ内で制御します
前者のようにbreakを使って抜け出すのは特別な理由がある場合にif制御文などを通して使われます
do 〜 whileループ
whileに似たループで doステートメント があります
whileステートメントと特別な違いはありませんが、ひとつだけ大きく異なる部分があります
それはステートメントを実行したあとで式を評価するということです
whileやforステートメントでは、式を評価してからループを行ないました
そのため実行の時点で評価が偽であれば、ステートメントを一度も実行しませんでした
たとえ評価がどのような形であれ、最低でも一度は実行してほしい場合にdoは威力を発揮します
doステートメントは実行ステートメントが先にあり、その後に繰り返すかどうかを判定します
do ステートメント while (条件式);
ただし、doステートメントの場合は一般的に単体のステートメントを繰り返しに指定しません
可読性などを考慮して一行でもコードブロックを意図的に使用します
#include <stdio.h>
int main()
{
int count = 1;
int max;
printf("繰り返す回数を指定してください\n");
scanf("%d",&max);
do {
printf("%d回目のループです\r" , count);
count++;
} while (count <= max);
printf("\nプログラムを終了します");
return 0;
}
doを用いれば、たとえ0を入力されても必ず1度はステートメントが実行されます
プログラムの用途によって使い分けてください
while (expression) statement
statementをexprが真であるあいだ繰り返します
expression 評価する式を指定します
statement exprが真である間、くり返しすステートメントを指定します
do statement while (expression);
statementを実行したあとに条件式を評価します
statement exprが真である間、くり返すステートメントを指定します
expression 評価する条件式を記述してください