c语言中的意外输出

c语言中的意外输出,c,output,C,Output,我不熟悉c语言。我只是想知道为什么我的宏不能正常工作。它给我的输出是13,而我的预期输出是24 #include<stdio.h> #define mult(a,b) a*b int main() { int x=4,y=5; printf("%d",mult(x+2,y-1)); return 0; } #包括 #定义多(a,b)a*b int main() { int x=4,y=5; printf(“%d”,mult(x+2,y-1)); 返回0; }

我不熟悉c语言。我只是想知道为什么我的宏不能正常工作。它给我的输出是13,而我的预期输出是24

#include<stdio.h>
#define mult(a,b) a*b
int main()
{
    int x=4,y=5;
    printf("%d",mult(x+2,y-1));
    return 0;
}
#包括
#定义多(a,b)a*b
int main()
{
int x=4,y=5;
printf(“%d”,mult(x+2,y-1));
返回0;
}
mult(x+2,y-1)
扩展为
x+2*y-1
,等于
4+2*5-1
给出输出:
13

您可能希望得到答案
(4+2)*(5-1)
=
6*4
=
24
。要使其像这样展开,您应该将括号宏编写为@H2Co3,并建议:

#define mult(a,b) ((a)*(b))

同时阅读:由比亚恩·斯特罗斯图普

这是因为C宏是简单的文本替换,宏编写器必须确保在替换时在每个宏变量周围以及宏扩展本身周围插入括号,以防止生成的扩展具有新的含义

如果你观察你的程序:
mult(a,b)
被定义为
a*b

mult(x + 2, y - 1) = x + 2 * y - 1 = 4 + 2 * 5 - 1 = 4 + 10 - 1 = 13
正确的方法是:

mult(a, b) ((a) * (b))

因为它从字面上替换了参数:

mult(x+2,y-1) --> mult(4+2,5-1) --> 4 + 2*5 - 1 --> 13
尝试将定义更改为:

#define mult(a,b) (a)*(b)
在这种情况下,预处理后的结果如下:

int main()
{
    int x=4,y=5;
    printf("%d",(x+2)*(y-1));
    return 0;
}
这将解决问题,但仍然不是最好的方法

#define mult(a,b) ((a)*(b))
此版本被视为良好实践,因为在其他类型的情况下,第一个版本将失败。请参见下面的示例:

#include<stdio.h>
#define add(a,b) (a)+(b)
int main()
{
    int x=4,y=5;
    printf("%d",add(x+2,y-1)*add(x+2,y-1));
    return 0;
}
打印34而不是100。
对于((a)+(b))版本,它将转换为:

int main()
{
    int x=4,y=5;
    printf("%d",((x+2)+(y-1))*((x+2)+(y-1)));
    return 0;
}

给出正确答案。

在宏定义中使用括号

#include<stdio.h>
#define mult(a,b) ((a)*(b))
int main()
{
    int x=4,y=5;
    printf("%d",mult(x+2,y-1));
    return 0;
}
#包括
#定义多个(a,b)((a)*(b))
int main()
{
int x=4,y=5;
printf(“%d”,mult(x+2,y-1));
返回0;
}

这是因为不同的算术运算符具有不同的优先级。因此,在定义宏时始终使用括号

通过预处理器,应用初等数学,然后后悔没有遵守“始终插入宏参数”的规则。哦,下次在使用宏之前要三思。然后不要使用宏,而是编写一个(可能是
内联的
)函数。它需要是
#define mult(a,b)((a)*(b))
。这就是问题的根源。尝试将其更改为
((a)*(b))
,以习惯总是将所有内容括起来的习惯。否。这不是个好理由。不合理的习惯和没有正确解释的习惯不适用。@iionela.voinescu--嗯,不合理?为什么?这个问题难道还不够合理吗?还有,这里有很多很好的理由加上括号。用户在如何发布问题时说,他是C语言编程新手。我不需要你的评论向我解释,但他可能会。不要只是说这是一个好习惯,你应该在另一个答案中解释为什么会这样。像这样的事情,如果解释得当,在别人的心目中总是会更好。不,你没有。应该是
((a)*(b))
@asembansal做的!:)它应该是
((a)*(b))
#include<stdio.h>
#define mult(a,b) ((a)*(b))
int main()
{
    int x=4,y=5;
    printf("%d",mult(x+2,y-1));
    return 0;
}