鱼C论坛

 找回密码
 立即注册
查看: 402|回复: 0

[学习笔记] 每日一学17

[复制链接]
发表于 2024-12-13 19:39:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 6bingame 于 2024-12-13 19:39 编辑

编译于预处理指令2

宏定义嵌套

和变量定义一样,宏也是可以嵌套定义的。
例如:

#define A (1+2)
#define B A*A
#define C B+B

我们先定义了A,然后定义B,最后又定义了C,环环相套,次序不能颠倒。
宏展开后如下:

#define A (1+2)
#define B (1+2)*(1+2)
#define C (1+2)*(1+2)+(1+2)*(1+2)

例题1:已知重力加速是9.8,运行时间是2秒,使用变量式宏定义嵌套,求运行速度和运动距离。

  1. #include<stdio.h>

  2. #define A 9.8       //定义宏A

  3. #define B 2         //定义宏B

  4. #define V A*B       //嵌套定义宏V

  5. #define S 0.5*A*B*B //嵌套定义宏S

  6. int main()
  7. {
  8.     printf("匀加速度是:%f\n",A);

  9.     printf("运行时间是:%ds\n",B);

  10.     printf("经过计算,速度是:%f\n",V);

  11.     printf("经过计算,运动距离是:%f\n",S);

  12.     return 0;
  13. }
复制代码


例题分析:
本范例使用了宏的嵌套定义,在定义了A和B之后,定义的V和S就利用了A和B的值。
宏定义嵌套展开:

#define V 9.8*2
#define S 0.5*9.8*2*2

然后把宏展开,对源代码进行编译,从而输出结果。



宏定义范围

文件中的宏定义并非是从定义就有效到文件结束,我们可以圈定宏定义的作用范围,使用的方法是:

#define                //宏定义开始
......                        //宏定义范围
#undef                //宏定义结束

例题2:练习使用宏定义范围

  1. #include<stdio.h>

  2. #define A 2     //宏定义开始

  3. void function();

  4. int main()
  5. {
  6.     printf("调用fun函数前宏A的值是:%d\n",A);

  7.     function();

  8.     printf("调用fun函数后宏A的值是:%d\n",A);
  9. }
  10. #undef A        //宏定义结束

  11. #define A 12    //宏定义开始

  12. void function()
  13. {
  14.     printf("fun函数中宏A的值是:%d\n",A);
  15. }
  16. #undef A        //宏定义结束
复制代码


例题分析:本范例两次使用A作为宏名,进行了宏定义,这两次各圈定了自己的范围。从输出结果可以看出,当我们界定了宏定义的范围后,即使是同一个宏名,它的值也是不同的。



函数式宏定义

函数式宏定义的一般形式为:

#define 标识符 (参数列表)字符串

字符串包含标识符中的参数,参数列表可有一个或者多个参数组成。因为外观先调用含义一样,所以称之为函数式宏定义,也可以称为带参数的宏定义。

例题3:使用函数式宏定义求解圆周长和圆面积。

  1. #include<stdio.h>

  2. #define PI 3.1415926        //变量式宏定义

  3. #define C(r) 2*PI*r         //函数式宏定义,一个参数

  4. #define S(r) PI*r*r         //函数式宏定义,一个参数

  5. int main()
  6. {
  7.     int radius;

  8.     printf("请输入圆半径:");

  9.     scanf("%d",&radius);

  10.     printf("圆的周长是:%f\n",C(radius)); //使用宏定义

  11.     printf("圆的面积是:%f\n",S(radius));

  12.     return 0;
  13. }
复制代码


例题分析:
本范例的代码更为简洁,直接对周长和面积公式使用了宏定义的形式。

例题4:使用函数式宏定义求两个数中的最大值和两个数的乘积。

  1. #include<stdio.h>

  2. #define MAX(a,b)a>b?a:b

  3. #define MUL(a,b)(a*b)       //函数式宏定义,两个参数

  4. int main()
  5. {
  6.     int x,y;

  7.     printf("请输入x和y的值\n");

  8.     scanf("%d %d",&x,&y);

  9.     printf("max(%d,%d)=%d\n",x,y,MAX(x,y));

  10.     printf("mul(%d,%d)=%d\n",x,y,MUL(x,y)); //使用宏定义

  11.     return 0;
  12. }
复制代码


例题分析:
本范例定义了一个取两个数最大值的宏,结果也是正确的,似乎没有问题产生,其实暗藏着玄机。
把代码修改如下,再来运行。


  1. #include<stdio.h>

  2. #define MAX(a,b)a>b?a:b

  3. #define MUL(a,b)(a*b)

  4. int main()

  5. {
  6.     int a,b,c,d;

  7.     printf("请输入a,b,c,d的值\n");

  8.     scanf("%d %d %d %d",&a,&b,&c,&d);

  9.     printf("max(%d,%d)=%d\n",a+b,c+d,MAX(a+b,c+d));

  10.     printf("mul(%d,%d)=%d\n",a+b,c+d,MUL(a+b,c+d));

  11.     return 0;
  12. }
复制代码




多行宏定义

通常宏定义必须是单行的,但是我们也可以使用多行来定义一个宏,定义的方法就是使用反斜杠"\"。
例如:

#define mim(x,y)\                //多行宏定义开始
        ((x)<(y)?(x):(y))        //多行宏定义结束

这个指令写在两行中,第2行为了美观,插入了一些空白符,使用的是空格。但是需要注意的是,第1行的反斜杠"\"必须放在该行的结尾,也就是输入了"\"后,紧接着的就是回车。

例题5:多行宏定义示例

  1. #include<stdio.h>
  2. #define exchange(a,b){\
  3.     int t;\
  4.     t=a;\
  5.     a=b;\
  6.     b=t;}

  7. int main()
  8. {
  9.     int x=10;

  10.     int y=20;

  11.     printf("x=%d;y=%d\n",x,y);

  12.     exchange(x,y);      //使用宏定义

  13.     printf("x=%d;y=%d\n",x,y);

  14.     return 0;
  15. }
复制代码


例题分析:
本范例展示了如何使用多行宏定义。多行宏定义虽然不太常用,但遇见时大家应该认识并理解,特别是”\“的后面必须紧跟回车符。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-14 00:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表