6bingame 发表于 2024-12-12 16:33:24

每日一学16

编译于预处理指令

预处理指令

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

宏定义

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

变量式宏定义

一般形式为:

#define 标识符 字符串

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

1.宏定义和浮点数

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

#include<stdio.h>

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

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

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

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

    scanf("%d",&r);

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

    a = PI*r*r;

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

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

    return 0;
}


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


2.宏定义和运算符

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

#include<stdio.h>

#define D >

#define X <

#define E ==

int main()
{
    int i,j;

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

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

    if(i D j)

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

    else if(i E j)

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

    else if(i X j)

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

    else

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

    return 0;

}

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


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

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

#include<stdio.h>

#define T 1

#define F 0

#define S 5

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

int main()
{
    int i,j,t,num;

    int array;

    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)   //输入有效性判断

            again=T;      //使用宏

      else

            again=F;

      if(again==T)      //使用宏
      {
            array=num;

            total++;

            printf("请输入数据:");
      }
      else

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

    printf(N);            //使用宏

    for(i=0;i<S-1;i++)      //排序
    {
      for(j=i;j<S;j++)
      {
            if(array<array)   //交换条件
            {
                t=array;

                array=array;

                array=t;
            }
      }
    }
    for(i=0;i<S;i++)      //循环输出

      printf("%d ",array);

    printf(N);

    return 0;
}

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


4.宏定义和表达式

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

#include<stdio.h>

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

int main()
{
    int sum,x;          //声明变量

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

    scanf("%d",&x);

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

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

    return 0;
}



例题分析:
本范例比较特别,使用宏名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)两边的括号不能少,否则会发生错误。

FishC 发表于 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;
    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 = num;
      }
      else
      {
            printf("输入的数据不在1~9之间,请重新输入:");
      }
    }

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

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

    return 0;
}


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 每日一学16