目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
- 作成日: 2022-01-28
- 更新日: 2023-12-25
- カテゴリ: C言語
C言語のdo-while文の使い方
C言語には複数のループ文があります。
for文、while文、そしてdo-while文です。
do-while文は他のループ文と違い、ループ判定が後判定になっています。
そのためその特性を利用したコードを書くことが可能です。
この記事ではC言語のdo-while文について詳しく解説します。
関連記事
魔法の壺、プログラミングのライブラリ(Library)とは
頭悪い人にプログラミングは可能か?可能です
頭の悪い人の特徴とは?あなたはこんな時、頭が悪くなる
頭が悪い人のPythonのevalの使い方
頭がいい人のPythonのexitの使い方
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文とセットで覚えておきましょう。
🦝 < やれ、そして繰り返せ
🐭 < 御意