日下部陽一(void)さんと遊ぼう(7)


さて話を戻そう。私の反論が大チョンボだったというのは、マクロの存在を全く考慮に入れていないということにある。short codeを目指す場合、マクロを用いることでコードの短縮化が図れるならば当然マクロを使うだろう。そのマクロはC/C++言語においてプリプロセスで処理される。簡単に言ってしまえば文字置換である。文字置換であるがゆえにマクロは文法規則を全く無視して介入してくる。


そこでC/C++言語の文法構造のBNFやら何やらを持ちだしてきて等価性を言ってもマクロの前には無力なのである。


例えば、for(;exp;) の場合、セミコロンを省略できない。whileではセミコロンは必要ない。この違いがどういう結果を導くのか。次のような括弧つきのマクロがあった場合、whileのほうが短くなるのである。


#define FOREVER (1)

for(;FOREVER;)

while FOREVER

ではwhileのほうが文字数が短い。C言語の入門書によく出てくるようにマクロは下手に書くと評価順序が問題になる。そこで普通、定義するときに括弧で括っておくことが多い。

例)
#define max(x,y) (x>y?x:y)

こういう風に括弧で括られたマクロを直接用いるならばwhileで書いたほうが短いのである。また、コメント欄で指摘をいただいたが、


# hoge 『マクロ絡みであれば、場合によって短縮可能ではありますね。
#define W while
として、W を5回以上使う状況であれば。
ただ、while が5回も出てくるような short code は稀でしょうが・・・。』
のようなケースもある。


だから、「whileのほうがforより短くなることがある」という命題はYesなのだ。それがNoであることをいくら証明しようと頑張っても出来るはずがないのである。


しかし、このことと日下部さんが言った


while(exp1) { st1 st2 exp2; }

for(;exp1;) { st1 st2 exp2; }
が等価では無いということとはまったく別の問題だ。ならば、こちらから一点突破を目指すしか道は残されていない。

(つづく)