C言語編 第16章 同じ処理を繰り返す(do文)

先頭へ戻る

この章の概要

この章の概要です。

前判定と後判定

この章では、3つ目のループ構文である do文を紹介しますが、これは少しだけ毛色が違っています。

while文と for文によるループ構造は、「ループ内の処理」を実行するより前に「条件式」を判定する形になっています。 do文は、これとは反対に、「ループ内の処理」を実行し終えてから「条件式」を判定する形のループ構造もあります。 それぞれの処理の流れを図にすると、次のようになります。

[while や for のフローチャート] 前判定ループ [do のフローチャート] 後判定ループ

このような処理の流れを表す図を、フローチャート(流れ図)と呼びます。 色々な図形を用いて描く宗派(?) もありますが、一番重要なのは「流れ」であって、図形自体はあまりこだわる必要は無いでしょう。 既にフローチャート自体が時代遅れと言わざるを得ないところまで来ています。

この2つの図を見比べると、while や for では「ループ内の処理が1度も実行されないことがある」のが分かります。 一方、do のループでは「ループ内の処理が必ず1度は実行される」ことが分かります。

do文

do文は、次のように構造になっています。

do{
    ループさせる処理
} while( 条件式 );

do文は、whileキーワードがセットで付いてきます。 そのため、do-while文と呼ぶこともあります。 なお、while の後ろにあるセミコロンを忘れないように注意して下さい。

やはり { } について、その内容が1文だけなら省略できますが、 do文の場合は、省略してしまうと特に不明瞭になりやすいため、do文では省略しない人が多いはずです。

何が不明瞭かと言えば、後に付いてくる「while」が、do-while文を構成するための while なのか、 単独の while文なのかが分かりづらいということです。 何にせよ、{ } はいかなる場面でも省略しないことを勧めます。

do文の流れを整理すると、次のようになります。

  1. 「ループさせる処理」を実行する。2へ。
  2. 「ループさせる処理」が全て終了したら3へ。
  3. 「条件式」を調べる。「真」なら1へ。「偽」なら4へ。
  4. do文を終了させて、次の処理へ進む。

do文を使う機会は少ないと言えます。 読み易さが同レベルになるかどうかは別として、do文を使わずにプログラムを書き換えることは常に可能です。
また、while文や for文で自然に書けるループ構造では、あえて do文を使う理由はありません。 大抵の場合、do文に直すと、かえって読みづらいです。

do文を使う場面の一例としては、成功するまで入力を要求し続けるようなタイプのプログラムです。 例えば、次のような感じです。

#include <stdio.h>
#include <string.h>

int main(void)
{
    char password[16] = "password";
    char try_password[16];
    char str[16];


    do{
        puts( "正しいパスワードを入力して下さい。" );
        fgets( str, sizeof(str), stdin );
        sscanf( str, "%s", try_password );
    } while( strcmp( try_password, password ) != 0 );

    puts( "入力に成功しました。" );

    return 0;
}

実行結果:

正しいパスワードを入力して下さい。
passward
正しいパスワードを入力して下さい。
password
入力に成功しました。

do文を使うことによって、最初の1回を自然にループの中に含めることができます。 while文の場合だと、最初の1回を行うために、条件式が真になるように仕向ける必要があります。


練習問題

問題① 標準入力から 'q' が入力されるまで、「q を入力して下さい。」と出力し続けるプログラムを作成して下さい。

問題② 本文中のサンプルプログラムを、while文で書き直し、do文の場合と読み比べてみて下さい。

問題③ while文、for文のときと同様のプログラム「標準入力から受け取った文字を 10回出力する」を、do文を使って作成して下さい。


解答ページはこちら

参考リンク

更新履歴

'2018/2/13 do文の処理の流れについて補足。

'2018/2/9 全面的に文章を見直し、修正を行った。

'2009/4/11 新規作成。





前の章へ(第15章 同じ処理を繰り返す(for文))

次の章へ(第17章 処理の流れを制御する)

C言語編のトップページへ

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS