[C言語] do-while文とfor文の違いについて解説

C言語におけるdo-while文とfor文は、ループ処理を行うための制御構造ですが、その動作には明確な違いがあります。

do-while文は、少なくとも一度はループ内の処理を実行することが保証されており、条件式の評価はループの最後に行われます。

一方、for文は、初期化、条件式、更新式を一行で記述でき、条件式が最初に評価されるため、条件が満たされない場合は一度もループが実行されないことがあります。

これらの違いを理解することで、適切なループ構造を選択し、効率的なプログラムを作成することが可能です。

この記事でわかること
  • do-while文とfor文の基本的な構造と特徴
  • それぞれのループ文の使い分け方
  • do-while文とfor文を用いた具体的な応用例
  • 効率的なループ構造の選択方法

目次から探す

do-while文とfor文の基本

C言語におけるループ構造は、プログラムの中で特定の処理を繰り返し実行するために使用されます。

ここでは、do-while文とfor文の基本的な構造と、それぞれの特徴について解説します。

do-while文の基本構造

do-while文は、少なくとも一度はループ内の処理を実行したい場合に使用されます。

構文は以下の通りです。

#include <stdio.h>
int main() {
    int count = 0;
    // do-while文の開始
    do {
        printf("カウント: %d\n", count);
        count++;
    } while (count < 5); // 条件がtrueの間、ループを続ける
    return 0;
}

この例では、countが5未満の間、ループが実行されます。

do-while文は、条件が評価される前にループ内のコードが少なくとも一度実行される点が特徴です。

カウント: 0
カウント: 1
カウント: 2
カウント: 3
カウント: 4

for文の基本構造

for文は、ループの初期化、条件評価、更新を一行で記述できるため、繰り返し回数が明確な場合に便利です。

構文は以下の通りです。

#include <stdio.h>
int main() {
    // for文の開始
    for (int i = 0; i < 5; i++) {
        printf("カウント: %d\n", i);
    }
    return 0;
}

この例では、iが0から4までの間、ループが実行されます。

for文は、ループの制御が一箇所にまとまっているため、コードの可読性が高いのが特徴です。

カウント: 0
カウント: 1
カウント: 2
カウント: 3
カウント: 4

do-while文とfor文の共通点

スクロールできます
特徴do-while文for文
繰り返し処理可能可能
条件評価ループの最後ループの開始時
初期化、条件、更新別々に記述一行で記述可能

どちらの文も、特定の条件が満たされるまで繰り返し処理を行うために使用されます。

do-while文とfor文の違い

  • 実行タイミング: do-while文は、条件が評価される前にループ内のコードが少なくとも一度実行されます。

一方、for文は条件が最初に評価され、条件が満たされない場合はループが一度も実行されません。

  • 構文の簡潔さ: for文は、初期化、条件評価、更新を一行で記述できるため、繰り返し回数が明確な場合に適しています。

do-while文は、条件が後に評価されるため、少なくとも一度は実行したい処理に適しています。

これらの違いを理解することで、適切なループ構造を選択し、効率的なプログラムを作成することができます。

do-while文とfor文の使い分け

C言語におけるdo-while文とfor文は、それぞれ異なる特徴を持ち、用途に応じて使い分けることが重要です。

ここでは、初期化と条件評価、繰り返し回数の制御、コードの可読性、パフォーマンスの観点から、それぞれの使い分けについて解説します。

初期化と条件評価の違い

  • do-while文: 初期化はループの外で行い、条件評価はループの最後に行われます。

これにより、ループ内の処理が少なくとも一度は実行されることが保証されます。

int count = 0; // 初期化
  do {
      // 処理
  } while (count < 5); // 条件評価
  • for文: 初期化、条件評価、更新が一行で記述され、ループの開始時に条件が評価されます。

条件が満たされない場合、ループは一度も実行されません。

for (int i = 0; i < 5; i++) {
      // 処理
  }

繰り返し回数の制御

  • do-while文: 繰り返し回数が不明で、少なくとも一度は処理を実行したい場合に適しています。

ユーザー入力を受け付けるメニューなどでよく使用されます。

  • for文: 繰り返し回数が明確な場合に適しています。

例えば、配列の要素を順に処理する場合などに便利です。

コードの可読性

  • do-while文: 条件がループの最後にあるため、ループが少なくとも一度実行されることを明示的に示すことができます。

ただし、初期化と更新がループの外にあるため、コードが長くなることがあります。

  • for文: 初期化、条件、更新が一行にまとまっているため、ループの制御が一目でわかりやすく、可読性が高いです。

特に、繰り返し回数が決まっている場合に適しています。

パフォーマンスの違い

  • do-while文: 条件がループの最後にあるため、条件評価の回数がfor文よりも少なくなる場合があります。

ただし、パフォーマンスの違いは通常、微小であり、最適化コンパイラによって相殺されることが多いです。

  • for文: 初期化、条件評価、更新が一行で行われるため、ループの制御が効率的に行われます。

特に、繰り返し回数が多い場合に、パフォーマンスの向上が期待できます。

これらの観点を考慮し、プログラムの目的や条件に応じて適切なループ構造を選択することが重要です。

応用例

C言語のdo-while文とfor文は、さまざまな場面で応用することができます。

ここでは、具体的な応用例をいくつか紹介します。

do-while文を用いたメニュー選択

do-while文は、ユーザーがメニューから選択するようなインタラクティブなプログラムでよく使用されます。

少なくとも一度はメニューを表示し、ユーザーの入力に応じて処理を繰り返すことができます。

#include <stdio.h>
int main() {
    int choice;
    do {
        printf("メニュー:\n");
        printf("1. オプション1\n");
        printf("2. オプション2\n");
        printf("3. 終了\n");
        printf("選択してください: ");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                printf("オプション1が選択されました。\n");
                break;
            case 2:
                printf("オプション2が選択されました。\n");
                break;
            case 3:
                printf("終了します。\n");
                break;
            default:
                printf("無効な選択です。もう一度選択してください。\n");
        }
    } while (choice != 3);
    return 0;
}

このプログラムでは、ユーザーが 3 を選択するまでメニューが表示され続けます。

for文を用いた配列の処理

for文は、配列の要素を順に処理する場合に非常に便利です。

以下の例では、配列の各要素を表示します。

#include <stdio.h>
int main() {
    int numbers[] = {10, 20, 30, 40, 50};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    for (int i = 0; i < size; i++) {
        printf("numbers[%d] = %d\n", i, numbers[i]);
    }
    return 0;
}

このプログラムは、配列numbersの各要素を順に表示します。

do-while文とfor文の組み合わせ

do-while文とfor文を組み合わせることで、複雑な条件を持つループを実現できます。

以下の例では、ユーザーが正しい範囲の数値を入力するまで繰り返し、入力された数値を配列に格納します。

#include <stdio.h>
int main() {
    int numbers[5];
    int input;
    int i = 0;
    do {
        printf("0から100の間の数値を入力してください: ");
        scanf("%d", &input);
        if (input >= 0 && input <= 100) {
            numbers[i] = input;
            i++;
        } else {
            printf("無効な数値です。もう一度入力してください。\n");
        }
    } while (i < 5);
    printf("入力された数値:\n");
    for (int j = 0; j < 5; j++) {
        printf("%d ", numbers[j]);
    }
    printf("\n");
    return 0;
}

このプログラムは、ユーザーが5つの有効な数値を入力するまで繰り返し、入力された数値を配列に格納します。

ネストされたループでの使い分け

ネストされたループでは、外側のループと内側のループで異なるループ構造を使用することができます。

以下の例では、do-while文を外側のループに、for文を内側のループに使用しています。

#include <stdio.h>
int main() {
    int outer = 0;
    do {
        printf("外側ループ: %d\n", outer);
        for (int inner = 0; inner < 3; inner++) {
            printf("  内側ループ: %d\n", inner);
        }
        outer++;
    } while (outer < 2);
    return 0;
}

このプログラムは、外側のループが2回、内側のループが3回実行される構造になっています。

ネストされたループを使うことで、複雑な繰り返し処理を効率的に実現できます。

よくある質問

do-while文とfor文はどちらが効率的ですか?

do-while文とfor文の効率は、使用する状況によって異なります。

一般的に、for文は初期化、条件評価、更新が一行で記述されるため、繰り返し回数が明確な場合に効率的です。

一方、do-while文は少なくとも一度はループを実行する必要がある場合に適しています。

パフォーマンスの違いは通常微小であり、最適化コンパイラによって相殺されることが多いです。

do-while文はどのような場合に使うべきですか?

do-while文は、少なくとも一度はループ内の処理を実行したい場合に使用します。

例えば、ユーザー入力を受け付けるメニューや、条件が後に評価される必要がある場合に適しています。

条件が満たされるまで繰り返し処理を行う必要があるが、最初の実行が保証されている場合に有効です。

for文の初期化部分で複数の変数を使うことはできますか?

はい、for文の初期化部分で複数の変数を使用することができます。

カンマで区切ることで、複数の変数を初期化できます。

例:for (int i = 0, j = 10; i < j; i++, j--)のように記述することで、ijの両方を初期化し、更新することが可能です。

まとめ

do-while文とfor文は、それぞれ異なる特徴を持ち、用途に応じて使い分けることが重要です。

do-while文は少なくとも一度は処理を実行したい場合に、for文は繰り返し回数が明確な場合に適しています。

この記事を通じて、これらのループ構造の違いと使い分け方を理解し、適切な場面で活用できるようになったでしょう。

今後のプログラミングにおいて、これらの知識を活かして効率的なコードを書いてみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 繰り返し処理 (26)
  • 条件分岐 (27)
  • URLをコピーしました!
目次から探す