鱼C论坛

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

[学习笔记] 每日一学16

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

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

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

x
编译于预处理指令


预处理指令

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

宏定义

        宏定义是以 “#” 开头的,均为预处理命令,使用 “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[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)   //输入有效性判断

            again=T;        //使用宏

        else

            again=F;

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

            total++;

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

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

    printf(N);              //使用宏

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

                array[i]=array[j];

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

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

    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)两边的括号不能少,否则会发生错误。
想知道小甲鱼最近在做啥?请访问 -> 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 16:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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