この記事の要点
- while文は、ループ(繰り返し)処理の一種
- do-while文は、最低1回はループ内の処理を実行したいときに使う
- 何回繰り返すかが予め決まっていない場合は、break文などのループ制御と共に、無限ループを使う
以前、C言語について基礎や、C++やC#との違いについてご紹介していました。
今回は、ループ処理の一種であるwhile文やdo-while文についてご紹介します。
while文やdo-while文は、for文の仲間です。
しかし、for文と比べると影が薄く、
「for文はよく使うけど、while文はあんまり・・・」
「while文の使い方は忘れてしまいがち・・・」
という方も多いのではないでしょうか。
当記事では、while文やdo-while文の使い方をわかりやすく解説しています。
また、無限ループについても解説しているので、ループ処理に詳しくなりたい方は必見の内容です。
while文とは
while文は、ループ(繰り返し)処理を行う際に使います。
while文の構文は、以下の通りです。
while(条件式){ 処理 }
条件式とは、結果がtrueまたはfalseになる式のことです。
while文では、()内の条件式がtrueである間、{}内の処理が実行され続けます。
では、具体例を見ていきましょう。
int num = 0; // ① while(num < 3){ // ② num++; // ③ } printf("%d", num); // ④
「num < 3 がtrueである間、numの値を1ずつ増やす」というプログラムです。
順番に処理の流れを追っていきましょう。
- numに0が代入される。・・・①
- num < 3 をチェック。numは0なので、trueになる。{}の中へ。・・・②
- numの値を+1する(numの値は1になる)。・・・③
- num < 3 をチェック。numは1なので、trueになる。{}の中へ。・・・②
- numの値を+1する(numの値は2になる)。・・・③
- num < 3 をチェック。numは2なので、trueになる。{}の中へ。・・・②
- numの値を+1する(numの値は3になる)。・・・③
- num < 3 をチェック。numの値は3なので、falseになる。while文終了。・・・②
- コンソールにnumの値を出力する(3が出力される)。・・・④
このように、ある条件を満たす間、処理を繰り返したい場合にwhile文を使います。
do-while文とは
while文では、最初に条件式のチェックを行います。
つまり、最初から条件式がfalseなら、{}内の処理は一度も実行されません。
そこで、「最低でも1回はループ内の処理を実行したい」という場合は、do-while文を使います。
do-while文の構文は、以下の通りです。
do{ 処理 }while(条件式);
注意点は、while文と違い、do-while文では最後にセミコロン(;)をつける必要があることです。
それでは、具体例を見ていきましょう。
int num = 0; // ① do{ num++; // ② }while(num < 3) // ③ printf("%d", num); // ④
処理の流れはこちらです。
- numに0が代入される。・・・①
- numの値を+1する(numの値は1になる)。・・・②
- num < 3 をチェック。numは1なので、trueになる。{}の中へ。・・・③
- numの値を+1する(numの値は2になる)。・・・②
- num < 3 をチェック。numは2なので、trueになる。{}の中へ。・・・③
- numの値を+1する(numの値は3になる)。・・・②
- num < 3 をチェック。numは3なので、falseになる。do-while文終了。・・・③
- コンソールにnumの値を出力する(3が出力される)。・・・④
while文と比べると、最初の条件式のチェックがなくなっていきなり処理を実行していることがおわかりいただけると思います。
ループの制御
ループの途中でループを終了したり、処理をスキップしたりしたい場合があります。
そのようなときは、break文やcontinue文を使います。
- break文:ループを終了する
- continue文:後続の処理をスキップして、ループを次へ進める(ループは継続する)
こちらも具体例で感覚をつかみましょう。
以下は、文字列中の、'o'という文字の数を数え、画面に出力する処理です。
char string[] = "hello, world!"; int count = 0; int index = 0; while(true){ char c = string[index]; if(c == '\0'){ break; // 文字列の終端に達したら、ループを終了 } index++; if(c != 'o'){ continue; // 文字が'o'で無ければ以降の処理をスキップ } count++; } printf("%d", count); // 実行結果は「2」
文字列の終端(‘\0’)に達したときは、これ以上ループを続ける必要がないので、breakしています。
また、文字が'o'のときのみカウントしたいので、それ以外の場合はcontinueで処理をスキップしています。
無限ループとは
while文で、条件式を常にtrueになるように記述すると、無限に処理を繰り返します。
これを無限ループといいます。
while(true){ // 処理 }
このままだと永遠に処理が終わらないので、一見使い道がなさそうですが、前述したbreakを使うことで、ループから脱出できます。
ループの制御でご紹介したサンプルも無限ループで記述してあり、breakを駆使してループを終了させています。
このようなwhile文の使い方は、何回繰り返すかが予め決まっていないようなループ処理を記述する際に役に立つので、覚えておきましょう。
複数条件の設定
条件式は、複数の条件を組み合わせて1つの条件式としたり、否定したりすることができます。
具体的には、次の演算子を使います。
演算子 | 使用例 | 意味 |
---|---|---|
&& | a && b | a, b両方ともtrueならtrue、それ以外はfalse |
|| | a || b | a, bのどちらかがtrueならtrue |
! | !a | aがtrueならfalse, falseならtrue |
例えば、配列から6の倍数だけを画面に出力する処理を考えてみましょう。
6の倍数は、2の倍数であり、3の倍数でもあります。
条件式で表現すると、
となります。
そのため、次のようなコードとなります。
int array[] = {3, 6, 9, 12, 15}; int index = 0; while(index < 5){ int num = array[index]; if(num % 2 == 0 && num % 3 == 0){ printf("%d ", num); // 2の倍数かつ、3の倍数のときのみ出力 } index++; }
実行結果は「6 12 」となります。
まとめ
ループ処理は、プログラミングの基礎中の基礎で、システム開発の現場でも多用されます。
その中でも、while文は何回繰り返すかが予め決まっていない場合によく使われます。
そのような場合は、無限ループとして記述されることが多いので、breakなどのループ制御をしっかりマスターしておきましょう。
また、複数の条件を組み合わせて1つの条件式を作るテクニックを使えるようになると、よりできることの幅が広がります。
他にも、C言語で必要不可欠な重要なテクニックでありながら、初心者がつまづきやすいのが「ポインタ」です。
ポインタが難しいと感じている方や、ポインタの使い方やメリットがわからないという方に向けて、ポインタを効果的に習得する方法を解説していますので、参考にしてください。