演習4-14 K&R プログラミング言語C
2010年01月28日
演習4-14
最初に考えた答え。
#include <stdio.h> #define swap(t, x, y) { t tmp; tmp = y; y = x; x = tmp; } int main(void) { int x = 20; int y = 50; printf("x => %d, y => %d\n", x, y); swap(int, x, y); printf("x => %d, y => %d\n", x, y); return 0; }
実行結果
$ ./ex4-14 x => 20, y => 50 x => 50, y => 20
この答えの場合、以下のような {}
を使っていない if/else
文のようなケースでエラーが発生する。
if (x > y) swap(int, x, y); else swap(int, x, z);
上の if/else
文は swap
マクロが展開されて以下のようになる。
if (x > y) { t tmp; tmp = y; y = x; x = tmp; }; else { t tmp; tmp = z; z = x; x = tmp; };
この場合、}
の後に ;
が存在するため if
の代替部が無いことになり、そのため else
に対応する if
が存在しないことになる。
この問題を解決するために {}
の代りに do/while
を使うといいらしい。
#define swap(t, x, y) do { t tmp; tmp = y; y = x; x = tmp; } while (0)
プログラミング言語C 第2版 ANSI規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726