演習 4-14
無職の間にK&Rを再読。演習問題の解答をさらす。解く順番は適当。
演習 4-14
型 t の二つの引数を交換するマクロ swap(t, x, y) を定義せよ。(ブロック構造を使うとよい。)
Exercise 4-14
Define a macro swap(t, x, y) that interchanges two arguments of type t. (Block structure will help.)
これは図書館で答えを思いがけず見てしまった。
#define swap(t, x, y) { t tmp = x; x = y; y = tmp; }
でいいと思ったが、これだと、if文 の中でおかしくなることがある。
例えば以下の例。
if (a > b) swap(int, a, b); else swap(int, a, c);
は、
if (a > b) { int tmp = a; a = b; b = tmp; }; else { int tmp = a; a = c; c = tmp; };
と展開される。
if に続くブロックの後ろにセミコロンがついているのが問題で、構文エラーとなる(if の後ろは1つの文か、1つのブロックでないといけないが、上記の例の場合1つのブロック+1つの空文になっている)
それを解決するには、
#define swap(t, x, y) do { t tmp = x; x = y; y = tmp; } while(0)
こういう風に、do while で囲ってやればよい。
ということらしいが、本当にこういう解答を求めていたのか??