苦しんで覚えるC言語 10.1 回数不明のループ P184 – P187

回数を求めるループ

これまで解説してきた繰り返し処理は、処理回数が決まった構文であるfor文でした。
ここでは繰り返し回数が未定の場合に使用する構文を解説します。

 while(条件式)
 {
  繰り返したい処理;
 }

while文と呼ばれ、for文と同じ様に繰り返し処理を行う時に使用します。
初期値の設定やカウント回数の増減回数の指定などは存在しません。

if文と同じく条件式に書かれた条件が真の間だけ繰り返したい処理が実行され続けます。

 指定回数を処理させたい場合 ⇒ for文
 条件が真の間だけ処理させたい場合 ⇒ while文

回数指定 or 条件指定の違いで使い分けするイメージです。

参考書のねずみ算を参考に見てみましょう。

#include <stdio.h>

int main(void)
{
    double money = 1;
    int month = 1;

    while(money < 1000000)
    {
        printf("%02d 月目 : %7.0f 円\n", month, money);
        money *= 2;
        month++;
    }

    printf("%02d 月目 に : %7.0f 円となり、100万円をこえる。\n", month, money);

    return 0;
}

21月目に100万円を超えるのですが、21回繰り返されることはプログラムからは判断できません。
繰り返し処理の money *= 2; で、moneyの値が毎回2倍ずつ増えていき、
while(money < 1000000)の判定処理が偽になるまで続きます。

処理の順番は以下になります。
 ①while(money < 1000000)
 ②printf(“%02d 月目 : %7.0f 円\n”, month, money);
 ③money *= 2;
 ④month++;
 ①に戻る

①に戻ってwhile(money < 1000000)が偽になれば、while文から抜け出して、
15行目のprintf文に遷移します。

解説書にも記載がありますが、この参考書ではコンパイラをLSI C-86を想定しており、16bitコンパイラであることから、double money で宣言されています。

int moneyと宣言すると、このコンパイラでは100万の値を扱うことができません。
なので、double型で変数を宣言しているというわけです。

昨今はコンパイラも32bit、64bitとbit数が大きいため、int型で変数を宣言しておくことで問題ありません。

while文を扱う上での注意ですが、偽にならない条件式を記載すると無限ループになります。
永遠に処理をし続けてしまい、このwhile文から抜けてこないのでプログラムとしては最悪の結末になりますので、必ず成立する条件式を書く様に注意してください。

for文との交換性

参考書に書いてあるのは、while文をfor文の様に書くこともできる。という内容です。

int i = 0;

while(i < 10)
{
    printf("現在%d 回目",i);
 
    i++;
}

int i = 0; が初期化になります。
for文の ( ) の最左の記述部分になります。

while(i < 10)が条件式になります。
for文の ( ) の中央の記述部分になります。

i++;がカウント増加式になります。
for文の ( ) の最右の記述部分になります。

この様に置き換えることは可能ですし、for文も for(;;)と書けば、
無限ループが可能になります。
あるいは、for文の{ }内の処理部で、if文を用いて条件が真になれば break;で抜ける記述を書くことも可能です。

while文とfor文はどちらも代替可能な書き方ができます。