目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
目次
- C言語のdo-while文の使い方
- do-while文の構造
- do-while文の使いどころ
- do-while文でカウント変数をカウントする
- do-while文で年齢入力を行う
- do-while文でブロックを作る
- while文との比較
- おわりに
C言語のdo-while文の使い方
C言語には複数のループ文があります。
for文、while文、そしてdo-while文です。
do-while文は他のループ文と違い、ループ判定が後判定になっています。
そのためその特性を利用したコードを書くことが可能です。
この記事ではC言語のdo-while文について詳しく解説します。
関連記事
do-while文の構造
C言語のdo-while文の構造は↓のようになっています。
do { 処理; 処理; ... } while (判定式);
最初にdo
と書き、それから波カッコ({}
)を書きます。
そして波カッコの中にループさせたい処理を書きます。
それからwhile
を書いてカッコの中にループの判定式を書きます。
この判定式の結果が真のあいだ、do-while文はループを続行します。
このようにdo-while文はほかのループ文とは一風変わった構造になっています。
do-while文を実行すると最初にループの中の処理が実行されます。
そしてその後にやっとループの判定が入ります。
ループの判定が真なら再びdo
まで戻り、書かれた処理を実行します。
つまりこういうことになります。
do {} の中に入る
do {} の中の処理を実行
while (判定式) でループ判定
判定が真なら do {} の先頭に戻る
このようにdo-while文は最初に処理を実行し、ループ判定は後に実行されます。
do-while文の使いどころ
do-while文の使いどころはどこでしょうか?
do-while文はループする処理を判定式より先に実行するという特徴を持ちます。
そのため適しているのは↓のようなケースです。
ループ判定より先に実行させたい処理がある時
ループ判定より先に実行させたい処理の例として上がるのが、パスワードの入力処理です。
パスワードの入力では最初にユーザーにパスワードを入力してもらいます。
そしてそのパスワードがOKならループを抜けて、NGならループを継続します。
このような先にユーザーの入力を求めて、それからループ判定を行うような処理では、do-while文が向いています。
つまり↓のような場合です。
先に処理させたいことがある
その後にループするか判定したい
do-while文でカウント変数をカウントする
do-while文の実際のコードは↓になります。
#include <stdio.h> int main(void) { int i = 0; do { i += 1; } while (i < 4); printf("i: %d\n", i); // i: 4 return 0; }
↑のdo-while文のコードはカウント変数をループ中でカウントするコードです。
最初にカウント変数i
を定義しています。
int i = 0;
それからdo-while文を実行します。
do { i += 1; } while (i < 4);
do { ... }
ではカウント変数i
をインクリメントしています。
そしてwhile (...)
の判定ではi < 4
という判定式を使っています。
このループの条件はカウント変数i
が4
より下のあいだループを継続するというものです。
i
が4
以上になると判定式が偽になりループが終了します。
最後にカウント変数i
の値を出力しています。
printf("i: %d\n", i); // i: 4
このprintf()
の出力結果は「i: 4
」になります。
カウント変数i
が4
以上になっていることがわかります。
do-while文で年齢入力を行う
もう1つサンプルを紹介します。
do-while文を使ってユーザーに年齢を入力してもらうコードです。
#include <stdio.h> #include <stdlib.h> int main(void) { char buf[100]; int age; do { // バッファに年齢を入力 printf("年齢を入力してください > "); if (!fgets(buf, sizeof buf, stdin)) { break; } // バッファを整数に変換 age = atoi(buf); } while (age < 20); // 20歳より下ならループ return 0; }
↑のコードをコンパイルして実行すると↓のようになります。
年齢を入力してください > 17 年齢を入力してください > 18 年齢を入力してください > 19 年齢を入力してください > 20
このコードでは入力された年齢が20歳より下の場合はループを継続します。
つまり20歳より下の年齢は受け付けないという感じのコードです。
20歳より下の年齢が入力されたら何かエラーを出すというのもアリですが、誤入力の場合もあるのでこのようにループさせます。
何回かループが継続したら強制的にエラーを出すという設計もアリだと思います。
do-while文でブロックを作る
もう1つdo-while文の活用例を紹介します。
これは好む人とそうでない人にわかれますが、do-while文でブロックを作ることができます。
たとえば↓のようにです。
int a = 1; do { int a = 2; // 外のaとは別の変数になる } while (0);
while (0)
になっているのでこのdo-while文はループを実行せずにすぐに終了します。
しかしC言語では変数などのスコープは波カッコ({}
)ごとに作られるので、このようなdo-while文を書くことでスコープを1つ作ることが可能です。
このdo-while文はただの波カッコでも代用できますが、do-while文にしたほうが視覚的にわかりやすいのでこのようなコードを好まれる人もけっこういます。
int a = 1; { int a = 2; // 外のaとは別の変数になる }
while文との比較
do-while文と似ているwhile文と比較してみます。
まずwhile文は↓です。
while (判定式) { 処理; 処理; ... }
do-while文は↓です。
do { 処理; 処理; ... } while (判定式);
2つを比べると、do-while文の「処理より後に判定式」という特徴がよくわかるかと思います。
do-while文のdo
は「やる」とか「やれ」とかの意味になるので、do-while文は「やれ、そして繰り返せ」という日本語にすることも可能です。
while文は「繰り返せ、やれ」になっているので2つの構造の違いがよくわかりますね。
おわりに
今回はC言語のdo-while文について解説しました。
do-while文はかゆい所に手が届くループ文になっています。
while文とセットで覚えておきましょう。
(^ _ ^) | やれ、そして繰り返せ |
(・ v ・) | 御意 |