Macintosh (OS 10.15 Catalina)でC言語をプログラミングする方法を解説していきます。
この記事の対象者
前回は for ループ処理の応用編として、ループを一部飛ばしたり、無限ループを使う方法など、特殊なループの使い方について解説しました。今回は while ループ(do-while)について解説していきます。
前回の記事はこちら↓
while
条件を満たす間、処理を繰り返す命令文です。
書き方は以下の通りです。
while(条件){処理}
条件の箇所は、判定結果が True / False(真/偽)となるような式を書くのがセオリーです。例えばこのような感じですね。
この場合は、"number" という変数が5未満であるときに、式の判定結果として True となるので while の中の処理をし続けます。
for 文と似ているのですが、上の式の場合は for だと "number" をインクリメントする必要がありました。でないと、コンパイルエラーになってプログラムが動かないからです。
でもこの場合には、インクリメントを必須としないので、いとも簡単に無限ループが作れてしまいます。
それでは次の処理にも進まないし、プログラムとしても終了できないので、処理側の方で終了条件を記述する必要があります。例えば上のようなコードの場合には、単純にインクリメントしてあげればループの終了条件に該当し、処理を終了します。
インクリメントの例を以下に載せておきます。
{
number++;
}
do-while
先ほど説明した while 文をひと工夫させたような形で、do-while という書き方があります。
do{処理}while(条件)
do-while と while の違いは、「条件によらず最初に処理をするかしないか」です。
どういうことか、具体例を見ていきましょう。
{
printf("number の値は、%d です。\r\n", number);
number++;
}while (number < 5);
さきほどのコードでは、"number" が5未満の時に処理を行っていましたが、この上のコードでは "number" がどんな数値でも(たとえ5でも)、ひとまず printf の処理を行います。
上のコードの実行結果は以下のようになります。
continue とbreak
前回のfor 文の記事で解説した、continue と break も使用できます。
もちろん、for の時と同じような場面で使われることも多いですが、while では意図的に無限ループを作成するのが容易なため、そのループの脱出方法として用いられることも多々あります。
簡単な例としては、以下のコードです。
{
printf("number の値は、%d です。\r\n", number);
if (number == 5) break;
number = 1;
printf("number の値は、%d です。\r\n", number);
}
このコードでは、"number" が5の場合のみ無限ループを脱出できます。それ以外の場合は、"number" が1に上書きされて printf の無限ループです(笑)。
"number" が5の場合の実行結果は以下の通りです。
おわかりの通り「number の値は、1 です。」という文字列が出力されません。
for との差別化
ループは for もあるから何個も不要じゃないの?と思った方もいると思います。しかし、while 文には用いるべき特有の場合があるのです。
それは、結論から言うとファイル等のデータの読み込みです。例えばCSVファイル(comma-separated-values)を読み込む時に、全部で何行あるかわからないですよね。何行か数えて、for 文の条件値に設定して...とやっているとファイル毎に対応しなくてはいけず、スマートではありません。
そこで while を用いれば、ファイルを1行ずつ読み込みをしながら処理をしてくれて、ファイルの最終行の読み込みが完了し、これ以上読み込むものが無くなった時点でループ処理を抜けてくれるのです。
なので、10行のCSVファイルがこようと、300行のCSVファイルがこようと、プログラム(コード)の内容を一切変えずに処理することが可能です。
まあ、ファイルじゃなくて単純なループ処理なんだよなあ、という場合にはどっちでも処理可能だと思うので、好きな方を使用してください(笑)。
あと、無限ループを実行してしまい、コンソール画面が永遠に動いている時は、「Ctrl + C」 で停止できるので、落ち着いて対処してくださいね。
私は初めて無限ループをやってしまった時は、コンソールを強制終了させてました...。
続きはこちら↓