今日のC言語スコーラは、マクロに教えました。 が、マクロには色々ワナが待ち構えているわけで、それを判ってもらうべく、マクロの引数として '++n' とか渡してしまう実験をさせてみたのです。
↓こんなコードを書いてみました。
#define DISP_2BAI(x) printf("%d の2倍は %d なのかしら!?\n", x, x * 2)
int _tmain(int argc, _TCHAR* argv[])
{
int n = 10;
DISP_2BAI(1);
DISP_2BAI(10);
DISP_2BAI(n);
DISP_2BAI(++n); // マクロの弊害
getchar();
return 0;
}
# 出力結果
1 の2倍は 2 なのかしら!? 10 の2倍は 20 なのかしら!? 10 の2倍は 20 なのかしら!? 12 の2倍は 24 なのかしら!?
って何ーーー!? なんで正しそうな結果が出てるんだよ!!
私が想定した出力結果は 「12 の2倍は 22 なのかしら!?」*1 だったのですが……って、そもそも何かおかしくネ? ということで実験。
void Func(const int a, const int b)
{
printf("a = %d, b = %d\n", a, b);
}
int _tmain(int argc, _TCHAR* argv[])
{
int n = 0;
Func(++n, ++n);
getchar();
return 0;
}
# 出力結果
a = 2, b = 2
マジか。 「a = 2, b = 1」 になるんじゃないのか…。
ただ、後置インクリメントの場合だと確り1ズレが発生したりします。
…いやまぁ、引数に投げるときの評価順序は未定義とかいう話だった気がするので、正しいといえば正しいのかもしれませんが……腑に落ちねぇなぁー。
俺の中では、VCのバグ扱い決定。(ぉ
とはいえ、元々こんなコードは書かねぇわなぁー。
*1:1ズレが発生する予定だった