C言語におけるループとswitch構文:break statementの詳細解説と実践例


break ステートメントは、C言語で最も基本的な制御フローステートメントの一つであり、ループや switch ステートメントから抜け出すために使用されます。プログラムの流れを制御し、特定の条件下でループを終了させる必要がある場合に役立ちます。

構文

break ステートメントは、セミコロン ; で終わる単一行で構成されます。構文は以下の通りです。

break;

機能

  • switch ステートメントからの脱出:** switch ステートメント内の case ブロックの中で break ステートメントを使用すると、その case ブロックの処理のみが終了し、switch ステートメント全体から抜け出すことができます。
  • ネストされたループからの脱出
    ネストされたループ構造の中で break ステートメントを使用する場合、最も内側のループのみが終了します。外側のループは継続されます。
  • ループからの脱出
    break ステートメントが配置されているループを強制的に終了します。ループの残りのイテレーションはスキップされ、プログラムの実行はループの直後に続くステートメントに移ります。

以下の例は、 for ループから break ステートメントを使用して抜け出す方法を示しています。

for (int i = 0; i < 10; i++) {
  if (i == 5) {
    break;
  }
  printf("%d ", i);
}

このプログラムは、0 から 4 までの数字を出力します。ループカウンタ i が 5 に達すると、break ステートメントが実行され、ループが終了します。残りの数字 (6 から 9) は出力されません。

  • continue ステートメントは、ループの現在のイテレーションをスキップして次のイテレーションに進むために使用されます。一方、break ステートメントはループ全体から抜け出します。
  • ネストされたループから抜け出すために、複数の break ステートメントを連続して使用することができます。
  • break ステートメントは、ループや switch ステートメント内でのみ使用できます。ループや switch ステートメントの外で使用すると、コンパイルエラーが発生します。


for ループから break で抜け出す

この例では、for ループを使用して 1 から 10 までの数字を印刷します。しかし、ループカウンタ i が 5 になると、break ステートメントが実行され、ループが終了します。

for (int i = 1; i <= 10; i++) {
  if (i == 5) {
    break;
  }
  printf("%d ", i);
}

出力

1 2 3 4 5

while ループから break で抜け出す

この例では、while ループを使用して偶数のみを印刷します。ループ変数 i が 12 になると、break ステートメントが実行され、ループが終了します。

int i = 1;
while (i <= 20) {
  if (i % 2 == 0) {
    printf("%d ", i);
  }
  i++;
  if (i == 12) {
    break;
  }
}

出力

2 4 6 8 10 12

switch ステートメントから break で抜け出す

この例では、switch ステートメントを使用して曜日を表す文字列を出力します。case ブロック内で break ステートメントを使用することで、各 case ブロックの処理のみを実行し、switch ステートメント全体から抜け出すことができます。

#include <stdio.h>

int main() {
  char day = 'T';

  switch (day) {
    case 'M':
      printf("Monday\n");
      break;
    case 'T':
      printf("Tuesday\n");
      break;
    case 'W':
      printf("Wednesday\n");
      break;
    case 'Th':
      printf("Thursday\n");
      break;
    case 'F':
      printf("Friday\n");
      break;
    case 'S':
      printf("Saturday\n");
      break;
    case 'Su':
      printf("Sunday\n");
      break;
    default:
      printf("Invalid day\n");
  }

  return 0;
}

出力

Tuesday

ネストされたループから break で抜け出す

この例では、2 つのネストされた for ループを使用して、2 以下の奇数をすべて表示します。内側のループで break ステートメントを使用すると、外側のループの残りのイテレーションがスキップされ、次の奇数に進むことができます。

for (int i = 1; i <= 5; i++) {
  for (int j = 1; j <= 3; j++) {
    if (j % 2 != 0) {
      printf("%d ", i * j);
      break;
    }
  }
}
1 3 2 5


goto ステートメント

  • 欠点:
    • コードの可読性と保守性が低下する
    • スパゲッティコードと呼ばれる、理解しにくくメンテナンスが困難なコードにつながる可能性がある
    • goto ステートメントの使用は、一部のプログラミングスタイルガイドラインでは推奨されていません
  • 利点:
    • シンプルでわかりやすい構文
    • 特定の条件下でプログラムフローを非線形に制御する必要がある場合に役立つ
  • goto ステートメントを使用して、プログラム内の別の場所に直接ジャンプすることができます。

ラベル付き continue ステートメント

  • 欠点:
    • ラベルの使用により、コードが煩雑になる可能性がある
    • goto ステートメントと同様に、スパゲッティコードにつながる可能性がある
  • 利点:
    • ネストされたループ構造から抜け出すための明確な方法を提供する
    • break ステートメントよりもコード的可読性を向上させる可能性がある
  • 外側のループから内側のループをスキップするためにラベル付き continue ステートメントを使用できます。

再帰

  • 欠点:
    • 再帰は、スタックオーバーフローなどの問題につながる可能性がある
    • すべての状況で適切とは限らない
  • 利点:
    • コードをよりモジュール化および再利用可能にすることができる
    • 場合によっては、break ステートメントよりもエレガントなソリューションを提供できる
  • 再帰を使用して、ループをネストする代わりに、同じ処理を呼び出す関数を定義できます。
  • 欠点:
    • すべての状況で break ステートメントの代替手段として使用できるわけではない
  • 利点:
    • シンプルでわかりやすいアプローチ
    • コード的可読性を向上させる
  • ループ条件を調整して、特定の条件が満たされたらループを終了させることができます。
  • 欠点:
    • 適切なライブラリ関数を見つけることが常に可能とは限らない
    • 使用するライブラリによって、プログラムの依存関係が増加する可能性がある
  • 利点:
    • 既存のコードを再利用することで、コードを簡潔にすることができる
    • 場合によっては、パフォーマンスを向上させることができる
  • 特定のタスクを実行するために C 標準ライブラリまたはサードパーティ製のライブラリに含まれる関数を使用できる場合があります。