ループ

ループはプログラミングの基本です。面倒な反復タスクは人間よりもコンピュータにやらせたほうがよっぽど効率的だからです。それでは C 言語での使い方を見ていきましょう。

ループを用いたプログラムを作成するとたまに無限ループに陥ってプログラムが止まらなくなります。その際に特定のキーを押すことでプログラムを強制的に止めることができます。

  • Mac: controlキーを押しながらc
  • Windows: Ctrlキーを押しながらc
  • Linux: 機種に合わせてどちらか

while 文

while 文は条件が真の場合繰り返すといった構文になります。

10 回"C 言語ワークショップ"と出力するプログラムは次のようにかけます。

int main() {
    int count = 0;
    while (count < 10) {
        printf("C言語ワークショップ %d", count);
        count++;
    }
}

新しい内容がいくつか増えていますが安心してください。次のようなステップでループは実行されています。

  1. int count = 0;countという変数を用意し、0 で初期化しています
  2. while (count < 10)count が 10 未満である場合に繰り返すようにしています
  3. "C 言語ワークショップ"と一緒にすのループのカウントが表示されます
  4. count++;count変数に 1 を加算しています

このように書くことで 10 回繰り返すということが達成できます。

do-while 文

do-while 文は一度内容を実行したあとでループを行うか確認するような法文となっています。 一度は実行しなければいけないループや一度実行したあとでしか条件がわからない場合に使用されるケースが見られます。要するに条件を確認するタイミングの違いです。

先程の例と同じものを書いています。

int main() {
    int count = 0;
    do {
        printf("C言語ワークショップ %d", count);
        count++;
    } while (count < 10);
}

for 文

for 文は最も多く使われるようなループの方法ですが、少し書き方がややこしくなっています。先程の例を書き直してみましょう。

int main() {
    for (int count = 0; count < 10; count++) {
        printf("C言語ワークショップ %d", count);
    };
}

少し分かりづらいですよね。 解説すると次のようになっています。

for(ループに用いる変数の初期化; ループの条件; ループの変数更新)

これまで while で行っていた内容をひとまとめにしたものですね。

余談 -ループ変数の宣言はは for の外側か内側のどちらで行うべきか-

授業資料で for を見ると次のように書かれているのではないでしょうか?

int main() {
    int count; //これ
    for (count = 0; count < 10; count++) {
        printf("C言語ワークショップ %d", count);
    };
}

この書き方と今回の資料で用いた書き方のどちらが良いかという話です。

少し深い話にはなってしまいますがプログラミング言語の多くにはスコープという概念が存在します。ある変数がどこから見れるかということです。

int global; // グローバルスコープ(プログラムのどこからでも見れる)

int main() {
    int local; // ローカル変数(main関数(現在の関数)から見れる)

    if(1) {
        int a; // ifのスコープの変数(ifの中だけで見れる)
    }
}

スコープの広いグローバル変数などを用いるとコードが読みにくくなり、バグの原因が分かりにくくなるとされています。参考:【C 言語】なぜグローバル変数は使わない方が良いのか?

なので、基本的にはスコープは狭い範囲にできると良いとされています。

もう一度 for を見てみましょう。

int main() {
    for (int count = 0; count < 10; count++) {
        // count が見れる
        printf("C言語ワークショップ %d", count);
    };
    // countが見れない
}
int main() {
    int count;
    for (count = 0; count < 10; count++) {
        // countが見れる
        printf("C言語ワークショップ %d", count);
    };
    // !!!countが見れる!!!
}

前者の宣言の仕方ではfor の中でのみ変数を見ることができます。スコープを狭めるほどよいという考えで行くのであれば前者のほうが良いのではないでしょうか?

個人的には基本的にこの資料で扱っている書き方を使っています。