期待されない答え

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()は現実に起こり得る間違いなので注意。