演習4-14 K&R プログラミング言語C

演習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)

参考:演習 4-14 – つまみ食う

プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»