题目
使用带参数的预处理宏定义 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