パソコン活用研究シリコンバレー(C、C++、の活用研究)

          Forループのスゴ技

(準備中)

C言語のForループは旧BasicのForループと仕様的にかなり異なる部分もあり、
スゴ技(というか場合によっては落とし穴)があります。

Forループの基本構文は繰り返し処理と条件分岐をご参照下さい。
またForループの実用的な使い方は無条件分岐と補助制御文をご参照下さい。

1.終了判定条件式、更新条件に詰め込む

FOR文の構文は、
FOR (式1; 式2; 式3) 
ですが、式1で複数の式を書いて複数の変数を初期化したり、式2の終了判定条件で演算をしてループを回るごとに、
終了判定条件を変更したり、式3の更新条件でいろいろ実行させたりすることが可能です。

CのFor文では、式1はForループに入るときに1回だけ実行され、式2の終了判定条件はForループに入るたびに
最初に実行されます。そして式3はForループが終わりまでいく度に実行されます。

以下のtricfor.cでは式2の終了判定条件はループを回るたびに条件が変更されています。
式3ではprintfで変数を表示させています。


<tricfor.c>

#include <stdio.h>

int main() {
        int i,j;
        for (i=0,j=10;i<j--;i++,printf("i:%d, j:%d\n",i,j)){}
return 0;
}
 


実行例(Borland C++55でコンパイル)
変数i,jがループを回るたびに更新され、jが5になったのを最後にForループを抜けています。


旧BasicとCのForループは仕様的に結構異なります。

旧BASICでは以下のプログラムにおいて、
20行目のfor文で終了条件は10に確定してしまうので、30行目でJを減少させても
このループはI=10になるまで回ります。
10 J=10
20 for I=0 to J
30 J=J-1
40 NEXT

(※)BASICのForループについてはForループの落とし穴をご参照。
その他、goto文でForループに飛び込むという魔王クラスの悪魔コード

JavaScriptなどCの影響を受けているプログラム言語のFor文はCに近い仕様です。


2.goto文でForループに飛び込む

goto文で多重ループから一気に飛び出すということはたまにありますが、goto文でforループに
飛び込んでいくというのはまずないでしょう。
旧Basicではgoto文でforループに飛び込むことはできませんでしたが(エラーになる)、C言語では
一応可能です。

以下のgototest.cでは、i = 5の状態でforループの中に飛び込んでいきます。
実行結果を見ると、初期化のための式1はスルーされて、i = 5の状態からループを
回り始めて、iが9の時までループを回って終了しています。
goto文でforループに飛び込めるというのはすごい仕様です。

<gototest.c>

#include <stdio.h>
int main() {
int i;
i=5;
goto label;

for (i=0;i<10; i++) {
label:
printf("%d", i);
 }
}

実行結果




TopPage