本物のC

C の基本:ループ


処理を繰り返す

配列の値の和を求める時の様に、同じ処理を繰り返す事をループ(loop)処理と言いますが、ひたすらに繰り返すのではプログラムが終わらなくなるので何らかの条件を設けます。

ループの継続条件を毎回の処理のに評価するのがwhile文です。

while (ループを継続する条件)
繰り返す処理

これに対し、継続条件を毎回の処理のに評価するのがdo-while文です。

do
繰り返す処理
while (ループを継続する条件);

つまりdo-while文では、繰り返す処理が必ず一度は実行されます。

while文を用いてN回の繰り返し処理を書く場合、

int i;
...
i = 0;
while (i < N)
{
...
i++;
}

の様なパターンを使う事になりますが、これを毎回書く面倒を避ける為にfor文が用意されています。

for (式1; 式2; 式3)
繰り返す処理

式1が事前に評価され、毎処理の後に式2を継続条件として評価し、真の場合は式3が次の処理の前に評価されます。つまりN回の繰り返しを

int i;
...
for (i = 0; i < N; i++)
繰り返す処理

と書く事ができます。C99 では式1の所に変数の宣言も書ける様になったので、

for (int i = 0; i < N; i++)
繰り返す処理

とも書く事ができます。このiのスコープはfor文の残りの部分に限られます6.8.5.3#1

ループ中のジャンプ

ループはbreak文により途中で止める事ができます。例えば次のコードはstr[5]のヌル文字により!str[i]が真となるので、iの値が 5 の処理の途中でループを抜けます。

char str[] = "hello";
for (int i = 0; i < 32; i++)
{
if (!str[i])
break;
printf("%c-", str[i]);
}

一方、現在の処理の残りを飛ばすcontinue文もあります。これは正確に言うと「現在の処理の最後に飛ぶ」もので6.8.6.2#2、例えば次のコードのcontinue;はプログラムの動作を変えません。

for (int i = 0; i < N; i++)
{
...
continue;
}

特にcontinueで飛んでも、上で言う式3が次の処理の前に実行される点に注意して下さい。 つまりcontinueは、ループの最後に(空の文への)ラベルがあって、

for (int i = 0; i < N; i++)
{
...
loop_end: ;
}

そこへgotoで飛ぶのと同等です。