关于#c语言 define#的问题,如何解决?


#include 
#define MAX(A,B) A>B ? A*2 : B*2

int main()
{
    int a = 1, b = 2, c = 3, d = 4, t;
    t = MAX(a + b, c + d);
    printf("%d\n", t);

    return 0;
}

B*2不应该是14吗,请问是怎么得到11的?

MAX调用应该修改为MAX((a+b),(c+d))才会得到14,
程序现在B×2等于3+4×2=11,希望能解答你的疑问!

宏定义只是代码块别名,你替换一下代码就知道怎么回事了,如下:

t  = a+b>c+d?a+b*2:c+d*2

a,b,c,d分别是1,2,3,4
所以
t = 1 + 2 > 3 + 4 ? 1 + 2 * 2 : 3 + 4 * 2
显然,1+2>3+4不成立,因此t = 3 + 4 *2 = 11

宏替换就是直接用变量名去替换宏定义里边的变量,比如t=MAX(a+b,c+d)它等效为t=a+b>c+d? a+b2:c+d2。而不是t=(a+b)>(c+d)? (a+b)*2:(c+d)*2

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在这段代码中,宏定义的 MAX(A,B) 会将 A 和 B 作为参数传递进去,并使用条件运算符 ?: 对它们进行比较和处理,然后返回一个值。在你的代码中,宏定义的展开形式为:

t = a + b>c + d ? a + b * 2 : c + d * 2;

这里要注意运算符的优先级,乘法运算符 * 的优先级高于三目运算符 ?:,所以这个表达式会被解释为:

t = a + (b>c + d ? a + b * 2 : c + d) * 2;

因为 b = 2, c = 3, d = 4,所以 b > c + d,所以条件为 false,表达式的结果为 c + d * 2 = 10。最后,将 a + 10 * 2 的结果 21 赋给 t,所以输出结果为 21。

为了避免这种问题,我们应该在使用宏定义时给参数加上括号,以确保运算顺序正确,例如:

#define MAX(A,B) ((A)>(B) ? (A)*2 : (B)*2)