for 文について

こんな話,Web に無限に記事が転がっててソースコードも無限にある気がするので, ここで僕が書いても完全に無駄な気がするけど,書いてみることにした。

C とかそのシンタックスの影響を受けた言語では共通のシンタックスとして,for 文ってのがある。 どういうシンタックスかというと,こんなこと今更書いても無駄な気がするけど,

for (初期化; 継続条件; カウンタを更新) {
    なんか実行したい処理();
    ...
}

みたいな感じで,ミニマルな例としては,

for (int i = 0; i < 5; ++i)
    puts("Hello, world!");

みたいなものになると思う。

ところでこれ,ループカウンタを使わない場合でも便利な場合があるってのが今回書きたいことで, なんか怪しい入門の本とか記事みたいなのでは触れられていない部分だと思う。

例えば,C の文字列のバイト数を数えたい場合。 まあ標準ライブラリを使うなら,strlen(3) で一発なんだけど,ここは例として, こういう書き方ができる。

char *str = "Hello, world!";
size_t len = 0;

for (char *s = str; *s; ++s) ++len;

なぜこういう書き方で動くかというと,C では文字列は NULL 終端されていることになっていて, “Hello, world!” という文字列は

'H' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' 0

という配列になっている。 最後に 0 があるってのがポイントで,0 は 偽として処理されるので,継続条件が偽になってループが終わる。

あと継続条件のところで関数呼ぶようなのもあるけど,まあぱっと例が思いつかないのでいいや。

書こうとはしたものの意外と例が思いつかないもんですね。