日下部(void)さんと遊ぼう(13)
しかしこの話には後日談がある。菊やんさんが、面白い話題を振ってくれたのだ。
for (exp1;exp2;exp3) st
と
exp1; while (exp2) {st exp3;}
が等価にならないのはcontinueがあるときとexp3で新しい名前が導入される場合かなexp3でAという名前が定義されると st の挙動が変わるからね。
他には exp3 にラベルをつけられるってのが利点?
exp3で名前が導入できるというのは、驚くべきことにint A = 1;
{
for (;A--; exp3) {
printf("%d\n", A);
}
}
において、ループは一回しか実行されないのに、100とか出力できるような式exp3が書けるということです。 C89でも書けます。でも、えらい長いのでショートコードには使えません。
簡略化すると、菊やんさんが言っているのは次のことである。
int main() {
int A = 1;
{
sizeof(EXP);
printf("%d\n", A);
}
return 0;
}
が、100を出力するような式EXPをマクロとかを使わずに書けると言うのだ。(id:kikx:20061121)
これは式EXPに enum{A=100} と書くと良い。この問題はC++では書けない。なぜならC++では「式の中で新しい型を定義してはいけない」と決まってるからである。これ以上の解説はしない。その理由については自分で考えて欲しい。
日下部さんとのほんとくだらない煽り合戦をきっかけとしてこんなC言語の暗黒面に触れられたのは何よりの収穫であった。