【C言語】forループの基本 カッコの中がどのように実行されるか?

 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();
というプログラムの場合は

  1. iにゼロが代入される
  2. i<3が評価される。現在iは0なのでこの条件は真となる
  3. hogehoge()が実行される
  4. iが増分する
  5. i<3が評価される。現在はiは1なのでこの条件は真となる
  6. hogehoge()が実行される
  7. iが増分する
  8. i<3が評価される現在はiが2なのでこの条件は真となる
  9. hogehoge()が実行される
  10. iが増分する
  11. i<3が評価される、現在はiは3なので、この条件は否となりループ終了

という流れです。非常に重要なので冷静に理解できるまでトレースをしてみて下さい。

あまり、for文のカッコの中を荒らすのは良くないですが、どのようにfor文が動いているか以下のコードで確認してみて下さい。

  1. #include<stdio.h>
  2. //表示プログラムが煩雑にならないように関数にする
  3. int xtest(const char *str){    printf("%s\n",str);    return 1;}
  4. //for文がどのように回っているかチェックする
  5. main(){
  6.     int i;
  7.     xtest("Before for");
  8.     
  9.     for(i=0,xtest("init");i<xtest("conv")*5;i+=xtest("inc"))
  10.     {
  11.         xtest("for loop");
  12.         
  13.     }
  14.     
  15.     xtest("Exit for");
  16.     
  17. }

無理やり表示する文などをforのカッコ内に入れています。これでどのように実行されるか流れをつかめたのでは無いでしょうか?

  1. Before for
  2. init
  3. conv
  4. for loop
  5. inc
  6. conv
  7. for loop
  8. inc
  9. conv
  10. for loop
  11. inc
  12. conv
  13. for loop
  14. inc
  15. conv
  16. for loop
  17. inc
  18. conv
  19. Exit for
  20. PS C:\Users\j\OneDrive - フリーランス\c>

最後に

実は本職のプログラマーとされる人でも扱っているコードの深い部分を知らなかったりします。また、開発対象が大きくなるほど作業の標準化がされて、そのとおり使えば良いんだ! 的な考えになっていると思います。

ただ、それだけじゃ、ツールに使われているだけの状態なので、これを機会に色々細かいところを実験してみて下さい。

Amazonでプログラミングについての本を探す
動画を見る

ウィンドウズアプリ入門 クリップボードにコピーされたらメッセージを受信する方法

 Windowsアプリでコピーされたときにイベントを取得できると便利です。例えばコピーされた内容を画面に表示したい場合などです。 もちろんタイマーイベントで定期的にポーリングをする方法もありますが、やや無駄な処理かもしれません。 Windowsとしてはコピーされたときのイベントを...