#define SQUARE(x) x * x 是一个安全的宏定义,SQUARE(2+3) 会正确计算出 $25$。
答案B。根据编程知识分析判断。
仔细审题,注意限定词和否定词。用排除法缩小选项范围。
【考点】宏展开|运算符优先级|预处理机制
🎯 考纲定位:本题考查宏展开与运算符优先级,对应 GESP 三级 C++ 第 3 章"预处理指令"。命题人卡住的是"宏是函数"的直觉误区——宏只是文本替换,不先求值参数。
🧠 解题思维:看到 SQUARE(2+3) 先想宏展开规则:#define SQUARE(x) x * x 会将参数 x 直接替换为 2+3,得到 2+3 * 2+3。再结合 C++ 运算符优先级,* 高于 +,所以计算顺序是 2 + (3 * 2) + 3 = 11。通法:遇到宏定义题,先写出展开后的表达式,再用优先级规则求值,别默认参数会先被计算。
🪤 陷阱拆解:错误选项 A 利用了"宏像函数"的直觉——考生误以为 SQUARE(2+3) 会先算 2+3=5 再平方得 25。但宏展开是纯文本替换,x 被替换成 2+3,表达式变成 2+3 * 2+3。最阴险的细节是"正确的宏定义应加括号"——#define SQUARE(x) (x) * (x) 才是安全的。只背结论的人会忽略宏展开顺序,掉进文本替换陷阱。
🔄 反命题思维:若改成 #define SQUARE(x) (x) * (x),展开后仍是 2+3 * 2+3 = 11,结果不变,但强调了括号的重要性。若改成 #define TRIPLE(x) x + x + x,TRIPLE(2+3) 会展开为 2+3 + 2+3 + 2+3 = 18(优先级陷阱重复)。刷到类似题,先问"命题人想考我宏展开顺序还是优先级"——本质是文本替换。