Cプログラミング入門

第18回 Chapter6 forとwhileで繰り返し(2)

この記事を読むのに必要な時間:およそ 2.5 分

breakとcontinue

for文やwhile文の中では,ループを中断するbreakや,ループを次に進めるcontinueが使えます。これらを順に説明します。

breakの例

for文やwhile文の中でbreak文を記述すると,ループはそこで中断し,その時点でfor文やwhile文の実行が終了します。このため,for文やwhile文の継続条件式の条件に関係なくループを中断することができます。

リスト6.3は,「整数を1から順に100まで足して行き,合計が初めて1000以上になったらその時の値を表示する」というプログラムです。このプログラムでは,変数iを使ってfor文でループしていますが,ループ中で合計が1000以上になったかどうかをif文で判断し,1000以上の場合はbreak文でループを抜けるようになっています。この例のように,break文はif文と組み合わせて使うのが普通です。

このプログラムを実行すると,図6.5の実行例のとおり,45まで加えたところで合計値が1035と1000以上の値になることがわかります。

リスト6.3 sum_break.c

#include <stdio.h>

int
main()
{
  int i, sum;

  sum = 0;
  for (i = 1; i <= 100; i++) {
    sum += i;
    if (sum >= 1000) {
      break;
    }
  }
  printf("i = %d, sum = %d\n", i, sum);
  return 0;
}

図6.5 リスト6.3(sum_break.c)の実行例

$ gcc -O2 -o sum_break sum_break.c
$ ./sum_break
i = 45, sum = 1035
$

continueの例

continueを使うと,その回のループだけを中断し,次の回のループから続けることができます。

continueを使ったプログラム例をリスト6.4に示します。このプログラムは,「1から100までの整数のうち,3の倍数以外の和を求める」というプログラムです。for文中のif文で変数iの値が3で割り切れるかどうかを判断し,3で割り切れた場合はcontinue文によってその回のループは実行しなくなり,「sum += i;」の文を実行せずに飛ばして次のループに移行します。なお,for文の再設定式であるi++は,continueされた場合でも実行されます

リスト6.4 sum_continue.c

#include <stdio.h>

int
main()
{
  int i, sum;

  sum = 0;
  for (i = 1; i <= 100; i++) {
    if (i % 3 == 0) {
      continue;
    }
    sum += i;
  }
  printf("sum = %d\n", sum);
  return 0;
}

図6.6 リスト6.4(sum_continue.c)の実行例

$ gcc -O2 -o sum_continue sum_continue.c
$ ./sum_continue
sum = 3367
$

continue文は,if文を使ってリスト6.5のように書くこともできます。

リスト6.5 sum_continue_1.c

#include <stdio.h>

int
main()
{
  int i, sum;

  sum = 0;
  for (i = 1; i <= 100; i++) {
    if (i % 3 != 0) {
      sum += i;
    }
  }
  printf("sum = %d\n", sum);
  return 0;
}

しかし,リスト6.5のようにcontinueを使わないで書くと,「sum += i;」の部分の文のネスティングが深くなり,ソースファイル上ではインデントも多くなって少し複雑に見えます。さらにこのあとに多数の文が続く場合,その違いは顕著になります。

continueを使った場合:

for (i = 1; i <= 100; i++) {
    if (i % 3 == 0) {
        continue;
     }
     sum += i;
     /* その他の処理 */
     /* その他の処理 */
           :
           :
           :
           :
}

continueを使わなかった場合:

for (i = 1; i <= 100; i++) {
    if (i % 3 != 0) {
        sum += i;
        /* その他の処理 */
        /* その他の処理 */
              :
              :
              :
              :
    }
}

著者プロフィール

山森丈範(やまもりたけのり)

「C言語はアセンブラを触っているうちに自然に覚えてしまった」というプログラマ。C言語とのかかわり上,OSは専らUNIXを使用。C言語のプログラムでは,いつもLinux/FreeBSD/Solarisすべてで動くことを気に留めている。C言語と同様に移植性の高いシェルスクリプトにも思い入れが深く,著書に『シェルスクリプト基本リファレンス』がある。

著書

コメント

コメントの記入