このページの解説は C99 をベースとしています。
以下は目次です。
第14章では、条件に応じて処理を分岐させる方法を学びました。今度は、条件に応じて処理を繰り返す方法を学習します。つまり、ループ構造📘です。
ループ構造を構築する方法として、すでに for文が登場しています(第12章を参照)。実のところ、このページで取り上げる内容はすべて、for文でも実現できます。ただ、for文は少し多機能すぎる面があります。
たとえば、for文は、変数 i のような、ループの周回とともに変化する変数がセットになるのが普通です。必要がなければ省略すればいいとはいえ、それはそれで少し不自然にみえます。
// 変数 i がセット
for (int i = 0; i < 5; ++i) {}
// いらなければ書かなければいいのだが、不格好
for ( ; value == 0; ) {}
基本的に for文は、「ある回数だけ繰り返す」というループ構造の構築に向いています。一方で、回数が明確でなく「ある条件を満たすあいだ繰り返す」というループ構造には向いていない場合があります。
そこで、「ある条件を満たすあいだ繰り返す」ループをつくる方法として while文 (while statement) があります。while文の文法は次のようになっています。
while (条件式)
繰り返したい文
要は、for文の「条件式📘」だけを残したものです。「条件式」を評価した結果が 0以外である間、ループします。「繰り返したい文」に書ける文は1つだけですが、ブロック文にすれば複数の文が書ける点もこれまでどおりです。
while文が作り出すコードのかたちは if文とよく似ています。if文なら、「条件式」が 0以外だったら文を1回だけ実行する。while文なら、「条件式」が 0以外であるあいだ、文を繰り返し実行する。ということになります。
// 変数 value の値が 0 のあいだ、ループする
while (value == 0) {
// ここを繰り返す
}
// 変数 value の値が 0 のときにだけ、文を1回だけ実行する
if (value == 0) {
// ここを1回実行する
}
次のプログラムは、入力された整数をそのまま出力することを繰り返します。負数が入力されたら、プログラムを終了します。
#include <stdio.h>
// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
char s[40];
(s, sizeof(s), stdin);
fgetsint value;
(s, "%d", &value);
sscanfreturn value;
}
int main(void)
{
int value = 0;
while (value >= 0) {
("Please enter the your integer.");
puts= get_input_integer();
value ("%d\n", value);
printf}
}
実行結果:
Please enter the your integer.
10 <-- 入力された内容
10
Please enter the your integer.
5 <-- 入力された内容
5
Please enter the your integer.
-1 <-- 入力された内容
-1
続いて、do文 (do statement) を取り上げます。
do文は、while キーワードとセットにすることで、特殊なかたちのループ構造を構築します。セットなので、よく「do-whileループ」という表現がなされます。
do文の構文は次のようになります。
do
繰り返したい文while (条件式);
do文によるループ構造が特殊なのは、「条件式」の判定をループの末尾でおこなう点です。そのため、「繰り返したい文」は必ず1回以上実行されます。
いつものように、「繰り返したい文」は1文だけしか書けませんが、{}
で囲ってブロック文にすれば、複数の文を書けます。
while文のときに例に挙げたプログラムを do文で書くと、次のようになります。
#include <stdio.h>
// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
char s[40];
(s, sizeof(s), stdin);
fgetsint value;
(s, "%d", &value);
sscanfreturn value;
}
int main()
{
int value;
do {
("Please enter the your integer.");
puts= get_input_integer();
value ("%d\n", value);
printf} while (value >= 0);
}
実行結果:
Please enter the your integer.
10 <-- 入力された内容
10
Please enter the your integer.
5 <-- 入力された内容
5
Please enter the your integer.
-1 <-- 入力された内容
-1
プログラムの実行中、do文のところに来ると、そのまま無条件で「繰り返したい文」の実行に入ります。そして、「繰り返したい文」の終わりまで実行を終えたら、「条件式」がチェックされます。条件式を評価📘した結果が 0以外であれば、ループは続行となり「繰り返したい文」の先頭に戻ります。0 であれば、ループは終了です。
変数value は do文の外側で宣言しなければなりません。「繰り返したい文」の中で宣言すると、「条件式」のところで value を使えないためです。
do文はあまり使われることはありません。「必ず1回は実行される」という特徴を有効に活かせる場面がそれほどないからです。while文や for文で書けるループを、わざわざ do文で書く意味はありません。
do文が適しているように思える場面でも、while文や for文で無限ループ(第17章)をつくり、break文(第17章)を使ってループを終えるようにするとうまく書ける場合があります。
問題① 標準入力から入力された整数分だけ、‘*’ を出力するプログラムを while文を使って作成してください。
問題② 標準入力から5の倍数の整数を入力させるプログラムを、while文を使って作成してください。5の倍数でない値が入力された場合、何度でも再入力を促すようにしてください。
問題③ 問題②のプログラムを do文を使って書き換えてください。
問題④ 次の while文はどういう意味ですか?
while (0) {
// なんらかの処理
}
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |