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

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

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

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

比如我们写一个程序来计算(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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论