题目

使用带参数的预处理宏定义 MAX(a, b) 求两数的较大值,并在程序中演示宏参数加括号对运算优先级的重要性。

输入格式:一行输入两个整数 a 和 b,以空格分隔。

输出格式:输出两个整数中的较大者。

数据范围与约定:-105 ≤ a, b ≤ 105。

思路与算法

1. 严格加括号规范
标准写法:#define MAX(a, b) ((a) > (b) ? (a) : (b))。不仅每个形参要加括号,整个三目表达式外层也必须加括号,防止表达式结合次序混乱。

2. 宏的副作用缺陷
由于宏是纯文本展开,若参数包含自增(如 MAX(x++, y)),表达式会导致同一变量被自增两次,这也是现代 C 语言推荐内联函数 inline 的原因。

完整程序

#include <stdio.h>

// 带参宏定义:必须为每个形参和整个表达式外层添加圆括号,防止因操作符优先级引发计算偏差
#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main(void)
{
    int x, y;
    if (scanf("%d %d", &x, &y) != 2) {
        return 1;
    }
    printf("%d\n", MAX(x, y));
    return 0;
}

运行示例

输入:

3 9

输出:

9

其它写法

下面每种写法都是完整程序,输入输出格式与正文一致,便于对照。

用 inline 函数代替宏

程序:

#include <stdio.h>

static int max2(int a, int b)
{
    return a > b ? a : b;
}

int main(void)
{
    int x, y;
    if (scanf("%d %d", &x, &y) != 2) {
        return 1;
    }
    printf("%d\n", max2(x, y));
    return 0;
}

输入:

3 9

输出:

9