MMGamesロゴ  MMGames
Twitterシェアボタン  Facebookシェアボタン   
しんで覚えるC言語
しんで覚えるC言語

ループ動作の仕組み

初期化と条件
前節では、for文で繰り返し(ループ)が実現できることを説明しましたが、
ここでは、そのfor文の動作の仕組みを、詳しく説明します。
より具体的なfor文の使い方は、次のようになります。

for文
for (初期化; 条件式; 更新) {
    繰り返す文;
}

初期化とは、カウント変数の初期化を行うための文です。
ここに書かれた式は、最初に1回だけ実行されます。

条件式とは、ループの終了条件を設定するための文です。
ここに書かれた式の値が真の間は、繰り返す文を実行し続けます。

更新とは、カウント変数の更新を行うための文です。
ここに書かれた式は、繰り返しを行う文を実行した後に実行されます。

これを元にして、前節で作成したプログラムの動作を調べてみます。

ソースコード
#include <stdio.h>

int main(void)
{
    int i;
    
    for (i = 1; i <= 10; i++) {
        printf("メッセージ\n");
    }

    return 0;
}

ここでは、初期化の式が i=1 となっています。
この式は最初に1回だけ実行されるので、ループの開始時点でiは1になります。

次に、条件式の比較を行います。
この段階ではiの値は1のままなので i<=10 の結果は真となり、
その結果、まだループは実行を続けることになります。

次に、繰り返す文を実行します。ここでは printf文が実行されます。

次に、更新の式が実行されます。
それまでiの値は1でしたが、 この更新の式はi++となっていますからiの値が1増加して2になります。
++演算子を忘れてしまった人は、5章1節6項を見て思い出してください。

この、条件式→繰り返す文→更新、という実行を何度も繰り返して、
iが11になった時 i<=10 の条件が偽となりループから抜け出すことになります。

この様に、カウント変数の値を変化させながら、条件が偽になるまで繰り返すことで、
決まった回数のループ処理を実現させているのです。

for文では、初期化・条件式・更新の部分に、どんな式を置いても構いません。
1回毎に1ずつ減らしたり、あるいは無関係の式でも構いません。
しかし、決まった回数のループの実現には、前節のような式が1番使いやすいです。
いつまでも・・・
for文では、どんな式を置いてもいいどころか、式を置かなくても構いません。
次のプログラムは、式を一切置かないfor文です。
ただし、このプログラムは実行しないことをオススメします。

ソースコード
#include <stdio.h>

int main(void)
{
    for (;;) {
        printf("メッセージ\n");
    }
    
    return 0;
}

このプログラムの実行結果は、次の通りになります。

実行結果
メッセージ
メッセージ
メッセージ
メッセージ
メッセージ


~以降省略~

このプログラムは、無限にメッセージを表示し続けます。
プログラムを強制終了させない限り、終わることはありません。
前項で紹介した9999回の場合、9999回できっちり終わりますが、
上記のプログラムは、本当にいつまでも終わりません。

これは、条件式を省略したので、その部分が常に真であると判定されてしまい、
いつまでたっても繰り返しを実行しているという状態に陥ったためです。
この様に、無限に実行されるループを、無限ループと呼びます。

キーワード
【無限ループ】

同じ動作を無限に繰り返すプログラムのこと。


実は、この無限ループは非常に広く使われるテクニックです。
みなさんが普段から使っている、一般的なアプリでは、
キー入力やマウス入力やタッチ入力があったら、それに対応した画面を表示するという処理を、
ユーザーがアプリを終了させるまでは永遠に繰り返しています。

つまり、これまでに作ってきたプログラムと違い、一般的なアプリは勝手に終わりません。
そのように、ユーザーが明示的にプログラムの終了を選ばない限り、
プログラムを終わらせないようにしたいときには、無限ループが使われています。
強制脱出
ユーザーが明示的にプログラムの終了を選ばない限り、プログラムを終わらせないようにしたいときには、無限ループを使うことは説明しました。
しかし、さきほどのプログラムでは、ユーザーの入力に応じて、プログラムを終了するための手段が用意されていませんでした。
ユーザーの入力値が、特定の値だった場合に、for文を終わらせてしまうようにすれば、ユーザーの入力によって終わるようにできます。

for文は条件式が偽になった時に終了するようにするのが普通ですが、
実は、途中で勝手にfor文を終わらせてしまうこともできます。
それには、break文を使用します。

for文の中でbreak文が実行されると、for文は強制的に終了され、
カウント変数はその時点の値のままとなります。
次のプログラムは、break文でループを終了させる例です。

ソースコード

#include <stdio.h>

int main(void)
{
    int i;

    for (i = 1; i <= 10; i++) {
        printf("%d\n", i);
        if (i == 3) break; /* ループを終了する */
    }

    return 0;
}

このプログラムの実行結果は、次の通りになります。

実行結果
1
2
3

条件式を見ると10回表示するまでは終わらないはずなのですが、 3回表示した時点で終了しています。

これは、3回目にiの値が3になり、if文の次のbreak文が実行されたためです。
break文はfor文の条件と同時に使用することができるので、
ユーザーの入力によって終わらせるため、繰り返し途中にエラーが発生した、など、
繰り返し回数が完了する以前に終了させるために使用できます。


本サイトについて

苦しんで覚えるC言語(苦C)は
C言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。

第0部:プログラム概要編
  1. プログラムとは何か?
2章:プログラムの書き方
  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2
3章:画面への表示
  1. 文字列の表示
  2. 改行文字
  3. 練習問題3
6章:キーボードからの入力
  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6
9章:回数が決まっている繰り返し
  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9
10章:回数がわからない繰り返し
  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10
13章:複数の変数を一括して扱う
  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13
20章:複数のソースファイル
  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20

コメント
COMMENT

💬 コメント投稿欄を開く