我好菜


私信TA

用户名:uq_60476127545

访问量:148

签 名:

等  级
排  名 10997
经  验 1000
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:
刚开始学的小白,个人把宏定义理解成和函数差不多的东西,这样在定义的时候就可以随意改变参数并且不会出错
注意事项:
看翁恺老师视频的时候老师一再强调

①带参数的宏一定要加括号

②整个值要加括号,参数出现的地方都要加括号

这样就不会被优先级所影响出现一些错误。

比如我们写一个程序来计算(a+b)*5的结果

#include#include#define s(a,b) a+b
int main(){
    int a = 5;
    int b = 9;
    printf("%d",s(a,b)*5);
    return 0;
}


按照理解,这个程序的结果应该是5+9然后*5=70,但是实际编译器输出的结果是

1.png


我们可以在编译代码时使用gcc file.c --save-temp,查看生成的file.i文件的最后几行

2.png


3.png


可以看到实际是把整个宏定义的参数直接带入,而在没有给整个参数值加括号就会导致计算出错。程序并没有把宏所定义的参数自动的看成一个整体


正确代码应该是

#include#include#define s(a,b) ((a)+(b))   
int main(){
    int a = 5;
    int b = 9;
    printf("%d",s(a,b)*5);
    return 0;
}

4.png

最后强调

①带参数的宏一定要加括号

②整个值要加括号,参数出现的地方都要加括号



参考代码:(我并没有给所有参数都加括号 。。。这并不符合上面所写的强调,主要是如果全部加括号我就乱了。。大家根据情况自行调节)

#include#include#define S(a,b,c) ((a+b+c)/2)
#define area(S,a,b,c) (sqrt(S*(S-a)*(S-b)*(S-c)))
int main(){
    double a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    double s = S(a,b,c);
    double m = area(s,a,b,c);
    printf("%.3lf",m);
    return 0;
}


 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区