C言語のfor文は最初の方で習いますが、その後は特に細かいことを気にせずに使っていると思います。普通に指定したパラメーター通りにループするだけなら特に問題は無いですが、込み入ったことをすると挙動がわからなくなることが多いです。
今回は改めて、for文の基礎というか細かいところを追いかけて見ます。
for文のカッコの中
for文のカッコの中は
for(int i=0;i<100;i++)
というようにセミコロンで、変数の初期化;条件;増分
と言った感じで「そういうものだ」という感じで書いているのでは無いでしょうか?
細かいことを考えずに動けば良いんだ! と思われます。しかし、エンジニアとしてツールを使う以上頭の片隅に真の理屈は置いておくほうが良いです。
ツールに使われているじゃなく、ツールを使っているって意識のほうが良いのでは無いでしょうか。
再びfor文のカッコの中
for文のカッコの中は以下の解釈です。
for(一度だけ実行される;ここがTrueなら「したいこと」を実行;「したいこと」が実行された後にここが実行される) 「したいこと」
です。整理するとカッコの中の1番めは、一度だけ最初に実行される箇所です。大体はループ用の変数の初期化が行われます。
カッコの二番目は、ループの各回が実行される前、この説明で言うと「したいこと」が実行される前に評価されます。ここの関数がtrueを返せば「したいこと」が実行されます。
カッコの三番目は、ループの各回が終了したら呼び出されます。多くはここでループ用の変数が増分されます。
具体的な動き
for(i=0;i<3;i++) hogehoge();
というプログラムの場合は
- iにゼロが代入される
- i<3が評価される。現在iは0なのでこの条件は真となる
- hogehoge()が実行される
- iが増分する
- i<3が評価される。現在はiは1なのでこの条件は真となる
- hogehoge()が実行される
- iが増分する
- i<3が評価される現在はiが2なのでこの条件は真となる
- hogehoge()が実行される
- iが増分する
- i<3が評価される、現在はiは3なので、この条件は否となりループ終了
という流れです。非常に重要なので冷静に理解できるまでトレースをしてみて下さい。
あまり、for文のカッコの中を荒らすのは良くないですが、どのようにfor文が動いているか以下のコードで確認してみて下さい。
- #include<stdio.h>
- //表示プログラムが煩雑にならないように関数にする
- int xtest(const char *str){ printf("%s\n",str); return 1;}
- //for文がどのように回っているかチェックする
- main(){
- int i;
- xtest("Before for");
- for(i=0,xtest("init");i<xtest("conv")*5;i+=xtest("inc"))
- {
- xtest("for loop");
- }
- xtest("Exit for");
- }
無理やり表示する文などをforのカッコ内に入れています。これでどのように実行されるか流れをつかめたのでは無いでしょうか?
- Before for
- init
- conv
- for loop
- inc
- conv
- for loop
- inc
- conv
- for loop
- inc
- conv
- for loop
- inc
- conv
- for loop
- inc
- conv
- Exit for
- PS C:\Users\j\OneDrive - フリーランス\c>
最後に
実は本職のプログラマーとされる人でも扱っているコードの深い部分を知らなかったりします。また、開発対象が大きくなるほど作業の標準化がされて、そのとおり使えば良いんだ! 的な考えになっていると思います。
ただ、それだけじゃ、ツールに使われているだけの状態なので、これを機会に色々細かいところを実験してみて下さい。