C/C++の基礎

C・C++のfor・while・do-whileループ

このレッスンでは、for、while、do-whileのループで処理を繰り返し、breakとcontinueでループを制御します。

はじめに

ループは同じ処理を何度も実行します。繰り返す回数が決まっているときはfor、条件が真の間繰り返すならwhile、本体を少なくとも1回は実行してから条件を調べたいならdo-whileが向いています。

大切なポイント

  • コンパイラの警告(compiler warning)を有効にして、すべての警告を直しましょう。
  • それぞれの値のデータ型と寿命(lifetime)をしっかり理解しましょう。
  • 入力データと配列のインデックスの範囲は必ずチェックしましょう。

動きで理解する

ステップを押すと、ループが1手ずつ進みます。条件の確認、本体の実行、トレース表が1行ずつ増えていく様子を見ましょう。

CとC++のコード例

C
実行 →
main.c
#include <stdio.h>

int main(void) {
    /* for: start; condition; step */
    for (int i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    printf("\n");

    /* while: repeat as long as the condition holds */
    int n = 20;
    int steps = 0;
    while (n > 1) {
        n /= 2;
        steps++;
    }
    printf("halved %d times\n", steps);

    /* do-while: the body runs at least once */
    int tries = 0;
    do {
        tries++;
    } while (tries < 3);
    printf("tries = %d\n", tries);

    /* break leaves the loop, continue skips to the next round */
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) continue;
        if (i > 7) break;
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}
実行結果
1 2 3 4 5 
halved 4 times
tries = 3
1 3 5 7
C++
実行 →
main.cpp
#include <iostream>
#include <vector>

int main() {
    // for: start; condition; step
    for (int i = 1; i <= 5; i++) {
        std::cout << i << ' ';
    }
    std::cout << '\n';

    // while: repeat as long as the condition holds
    int n = 20;
    int steps = 0;
    while (n > 1) {
        n /= 2;
        steps++;
    }
    std::cout << "halved " << steps << " times\n";

    // do-while: the body runs at least once
    int tries = 0;
    do {
        tries++;
    } while (tries < 3);
    std::cout << "tries = " << tries << '\n';

    // range-based for visits every element of a container
    std::vector<int> values{1, 3, 5, 7};
    int sum = 0;
    for (int value : values) {
        sum += value;
    }
    std::cout << "sum = " << sum << '\n';
}
実行結果
1 2 3 4 5 
halved 4 times
tries = 3
sum = 16

CとC++の比較

forループの先頭は、初期値、繰り返しの条件、増分の3つの部分からなります。breakはすぐにループを抜け、continueは今回の残りの処理を飛ばして次の繰り返しに進みます。C++には範囲ベースfor(range-based for)もあり、インデックスを使わずにコンテナのすべての要素をたどれます。

C

Cは小さな手続き型の関数を使い、データがメモリ上でどう表されるかをそのまま見せます。

C++

C++は低レベルの操作もできるまま、ライブラリの型やより安全な抽象化を加えます。

発展問題

両方のバージョンを実行し、コードを書き換えて、それぞれの言語がもたらす安全性の違いを観察しましょう。

  • 不正な入力や境界の値で試しましょう。
  • 警告を増やすフラグ-Wall -Wextra -Wpedanticを付けてコンパイルしましょう。
  • 共通の宣言はヘッダーファイルに、実装は別のファイルに分けましょう。

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ