演習 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 で囲ってやればよい。


ということらしいが、本当にこういう解答を求めていたのか??