鱼C论坛

 找回密码
 立即注册
查看: 322|回复: 1

[学习笔记] 每日一学16

[复制链接]
发表于 2024-12-12 16:33:24 | 显示全部楼层 |阅读模式

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

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

x
编译于预处理指令


预处理指令

        就是提前处理的指令,提前指的是在正式编译源代码之前,对预处理指令进行处理,将其替换成具有实际意义的内容,然后再进行编译。这么做的目的是为了改进程序设计环境,提高编程效率。

宏定义

        宏定义是以 “#” 开头的,均为预处理命令,使用 “define” 作为宏定义命令,用一个标识符来代表一个字符串,我们把这种特殊的指令称为宏定义,“标识符” 为所定义的宏名。“字符串” 可以是常数、表达式、格式串等。规模比较大的项目都会使用大量的宏定义来组织代码。C语言对宏的使用有很多复杂的规则,但是有些并不常用。
        宏定义,根据标识符的形式,大体上可以分为两种,分别是变量式宏定义和函数式宏定义。变量式宏定义的书写类似于变量的声明,用来定义常量,函数式宏定义的书写类似于函数,用来定义稍复杂些的带参数的表达式。
        写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性、可读性、方便性等。

变量式宏定义

一般形式为:

#define 标识符 字符串

把变量式宏定义细化,可分成如下几个方面,下面分别举例说明。

1.宏定义和浮点数


例题1:使用变量式宏定义圆周率PI计算圆的周长和面积。

  1. #include<stdio.h>

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

  3. int main()
  4. {
  5.     int r;          //定义圆的半径变量r

  6.     float c,a;      //定义圆的周长和面积变量c和a

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

  8.     scanf("%d",&r);

  9.     c = 2*PI*r;       //使用宏

  10.     a = PI*r*r;

  11.     printf("圆的周长是:%.3f\n",c);

  12.     printf("圆的面积是:%.3f\n",a);

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


例题分析:
本范例两次使用了圆周率PI。使用宏定义使程序简洁了不少,而且修改圆周率PI也方便了很多。


2.宏定义和运算符

例题2:输入两个数使用变量式宏定义和关系运算符比较两个数的大小。

  1. #include<stdio.h>

  2. #define D >

  3. #define X <

  4. #define E ==

  5. int main()
  6. {
  7.     int i,j;

  8.     printf("请输入两个数:");

  9.     scanf("%d %d",&i,&j);

  10.     if(i D j)

  11.     printf("%d大于%d\n",i,j);

  12.     else if(i E j)

  13.         printf("%d等于%d\n",i,j);

  14.     else if(i X j)

  15.         printf("%d小于%d\n",i,j);

  16.     else

  17.         printf("不存在这样的值\n");

  18.     return 0;

  19. }
复制代码


例题分析:
本范例中,对关系运算符之类的运算符一样可以使用宏定义。



3.宏定义和整数、字符串

例题3:输入5个范围1~9的整数,如果输入的数字超过范围,则提示重新输入。输入完毕,按照从大到小的关系排序后输出。

  1. #include<stdio.h>

  2. #define T 1

  3. #define F 0

  4. #define S 5

  5. #define N "\n"      //宏定义

  6. int main()
  7. {
  8.     int i,j,t,num;

  9.     int array[S];

  10.     int total=0;

  11.     int again=T;

  12.     printf("请输入%d个范围1~9之间的数据,否则将提示重新输入。",S);

  13.     printf(N);

  14.     printf("请输入数据:");

  15.     while(total<S)          //循环输入数据
  16.     {
  17.         scanf("%d",&num);

  18.         if(num>0&&num<10)   //输入有效性判断

  19.             again=T;        //使用宏

  20.         else

  21.             again=F;

  22.         if(again==T)        //使用宏
  23.         {
  24.             array[total]=num;

  25.             total++;

  26.             printf("请输入数据:");
  27.         }
  28.         else

  29.             printf("请重新输入:");
  30.     }
  31.     printf("按照从大到小输出如下:");

  32.     printf(N);              //使用宏

  33.     for(i=0;i<S-1;i++)      //排序
  34.     {
  35.         for(j=i;j<S;j++)
  36.         {
  37.             if(array[i]<array[j])   //交换条件
  38.             {
  39.                 t=array[i];

  40.                 array[i]=array[j];

  41.                 array[j]=t;
  42.             }
  43.         }
  44.     }
  45.     for(i=0;i<S;i++)        //循环输出

  46.         printf("%d ",array[i]);

  47.     printf(N);

  48.     return 0;
  49. }
复制代码


例题分析:
本范例综合使用了宏定义,如整数和字符串,输入N个正整数,输入错误就提示重新输入,然后再按照从大到小的顺序输出。


4.宏定义和表达式

例题4:使用变量式宏定义表达式计算表达式x*x+2*x的值

  1. #include<stdio.h>

  2. #define M (x*x+2*x)     //宏定义表达式

  3. int main()
  4. {
  5.     int sum,x;          //声明变量

  6.     printf("请输入一个数字:");

  7.     scanf("%d",&x);

  8.     sum=2*M+3*M+4*M;    //使用宏

  9.     printf("sum=%d\n",sum);

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



例题分析:
本范例比较特别,使用宏名M作为表达式,在主函数中必须定义变量x,否则会编译错误,原因是宏展开后程序中需要用到变量x。题中宏定义的作用指定标识符M来代替表达式(x*x+2*x)。在编写源程序时,所有的(x*x+2*x)都可以由M代替。而对源程序编译时,将先由预处理程序进行宏代换,即用(x*x+2*x)表达式去置换所有的宏名M,然后编译程序。程序中首先进行了宏定义,定义M来替代表达式(x*x+2*x)。在 sum=2*M+3*M+4*M中进行宏展开后,该语句变为:

sum=2*(x*x+2*x)+3*(x*x+2*x)+4*(x*x+2*x);

但需要注意的是,在宏定义中表达式(x*x+2*x)两边的括号不能少,否则会发生错误。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-12-12 16:33:54 | 显示全部楼层
例题3:输入5个范围1~9的整数,如果输入的数字超过范围,则提示重新输入。输入完毕,按照从大到小的关系排序后输出。

#include

#define T 1

#define F 0

#define S 5

#define N "\n"      //宏定义

int main()
{
    int i,j,t,num;
    int array[S];
    int total=0;
    int again=T;

    printf("请输入%d个范围1~9之间的数据,否则将提示重新输入。",S);
    printf(N);
    printf("请输入数据:");

    while(total < S)
    {
        scanf("%d", &num);
        if(num > 0 && num < 10)
        {
            array[total++] = num;
        }
        else
        {
            printf("输入的数据不在1~9之间,请重新输入:");
        }
    }

    // 排序
    for(i = 0; i < S - 1; i++)
    {
        for(j = i + 1; j < S; j++)
        {
            if(array[i] < array[j])
            {
                t = array[i];
                array[i] = array[j];
                array[j] = t;
            }
        }
    }

    printf("从大到小排序后的数字是:\n");
    for(i = 0; i < S; i++)
    {
        printf("%d ", array[i]);
    }
    printf(N);

    return 0;
}


例题分析:
在这个例子中,我们使用宏定义定义了一些常量以提高代码的可读性和易维护性。例如,`S`定义为5,表示要输入的数字个数。通过宏定义使代码显得更加整洁,并且在需要修改时更简单方便。排序部分使用了简单的冒泡排序算法,实现从大到小的排序。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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