/* 二つの値xとyの大きい方の値を返す関数形式マクロは以下のように定義できる #define max(x, y) (((x) > (y)) ? (x) : (y)) このマクロを利用して四つの値a, b, c, dの最大値を求める max(max(a, b), max(c, d)) および max(max(max(a, b), c), d) がどのように展開されるかを示し、考察を加えよ。 */ #include #define max(x, y) (((x) > (y)) ? (x) : (y)) int main(void) { int a, b, c, d; puts("四つの整数を入力してください"); printf("整数1:"); scanf("%d", &a); printf("整数2:"); scanf("%d", &b); printf("整数3:"); scanf("%d", &c); printf("整数4:"); scanf("%d", &d); printf("一番大きい値は%dです\n", max(max(a, b), max(c, d))); /* (((max( a, b )) > (max( c, d ))) ? (max( a, b )) : (max( c, d ))) ((( (((a) > (b)) ? (a) : (b)) )) > ( (((c) > (d)) ? (c) : (d)) ) ? ( (((a) > (b)) ? (a) : (b)) ) : ( (((c) > (d)) ? (c) : (d)) )) */ printf("一番大きい値は%dです\n", max(max(max(a, b), c), d)); /* max( max( (((a) > (b)) ? (a) : (b)), c ), d ) max( ((((((a) > (b)) ? (a) : (b))) > (c)) ? ((((a) > (b)) ? (a) : (b))) : (c)), d) (((((((((a) > (b)) ? (a) : (b))) > (c)) ? ((((a) > (b)) ? (a) : (b))) : (c))) > (d)) ? (((((((a) > (b)) ? (a) : (b))) > (c)) ? ((((a) > (b)) ? (a) : (b))) : (c))) : (d)) */ return 0; } /* どちらも可読性は悪いが max(max(max(a, b), c), d) 形式の方が若干読みやすいかもしれない。 あと、同じ処理を繰り返してるような気がするので max(max(max(a, b), c), d) 形式でやったほうが速いかも。 実は最初の形式は展開してる途中で混乱したので若干適当。 たぶん間違えてる。 */