C语言之#define

一.什么是#define

C语言中,可以用 #define 定义一个标识符来表示一个常量。
特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。

预编译又叫预处理。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。

二.#define的一般形式

用 #define 定义标识符的一般形式为:

#define  标识符  常量  

注意⚠️:最后没有分号

#define又称宏定义,标识符为所定义的宏名,简称
标识符的命名规则与前面讲的变量的命名规则是一样的。
#define 的功能是将标识符定义为其后的常量。一经定义,程序中就可以直接用标识符来表示这个常量。是不是与定义变量类似?但是要区分开!变量名表示的是一个变量,但宏名表示的是一个常量。可以给变量赋值,但绝不能给常量赋值。

三.#define如何工作?

其实预编译所执行的操作就是简单的**“文本”替换**。对宏定义而言,预编译的时候会将程序中所有出现“标识符”的地方全部用这个“常量”替换,称为“宏替换”或“宏展开”。替换完了之后再进行正式的编译。所以说当单击“编译”的时候实际上是执行了两个操作,即先预编译,然后才正式编译。#include<stdio.h>也是这样的,即在预处理的时候先单纯地用头文件stdio.h中所有的“文本”内容替换程序中#include<stdio.h>这一行,然后再进行正式编译。

四.终止宏 #undef

如果要终止其作用域可以使用 #undef 命令,格式为:

#undef  标识符

五.注意

程序中用双引号括起来的宏在预处理的时候是不会被宏替换的。因为在 C 语言中,用双引号括起来表示的是字符串。

# include <stdio.h>
# define PI 3.14159
int main(void)
{
    double r, s;
    printf("请输入圆的半径:");
    scanf("%lf", &r);  //scanf中, double只能用%lf
    s = PI * r * r;
    printf("s=PI*r^2 = %.6f\n", s);  //PI不会被宏替换
    return 0;
}

Output:

请输入圆的半径:1
s=PI*r^2 = 3.141590

六.define与const区别

角度1:
就定义常量说的话:
const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。

角度2:
就起作用的阶段而言:
define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。

角度3:
就起作用的方式而言:
define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
正因为define只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码:

#define N 2+3 //我们预想的N值是5,我们这样使用N
double a = N/2;  //我们预想的a的值是2.5,可实际上a的值是3.5

《#define和const的区别》https://blog.csdn.net/yi_ming_he/article/details/70405364

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值