期待されない答え
http://d.hatena.ne.jp/skelton_boy/20091217/1261053652の話、というよりhttp://d.hatena.ne.jp/Isoparametric/20091219/1261201890の話。ポータブルに仕様の穴を突く方向で考えてみた。
/* MyTypeの定義 */ typedef int MyType[1]; void set(MyType m, int val); void inc(MyType m); void print(MyType m); int main(void) { MyType m; set(m, 0); /* mを0にセット */ inc(m); /* mをインクリメント */ print(m); /* 1と表示される */ return 0; } /* 各関数の実装 */ static int m;/* mがローカルなんてどこにも書いていないよね! */ void set(MyType m, int val) { do { extern int m; m = val;/* mを0にセット */ } while (0); } void inc(MyType m) { do { extern int m; ++m;/* mをインクリメント */ } while (0); } void print(MyType m) { puts("1");/* 1と表示される */ }
〆。
set(), inc()は冗談だけれど、print()は現実に起こり得る間違いなので注意。