python中define的⽤法_#define⽤法,C语⾔#define详解
C语⾔中,可以⽤ #define 定义⼀个标识符来表⽰⼀个常量。其特点是:定义的标识符不占内存,只是⼀个临时的符号,预编译后这个符号就不存在了。
预编译⼜叫预处理。预编译不是编译,⽽是编译前的处理。这个操作是在正式编译之前由系统⾃动完成的。
⽤ #define 定义标识符的⼀般形式为:
#define  标识符  常量  //注意, 最后没有分号
#define 和 #include ⼀样,也是以“#”开头的。凡是以“#”开头的均为预处理指令,#define也不例外。
#define⼜称宏定义,标识符为所定义的宏名,简称宏。标识符的命名规则与前⾯讲的变量的命名规则是⼀样的。#define 的功能是将标识符定义为其后的常量。⼀经定义,程序中就可以直接⽤标识符来表⽰这个常量。是不是与定义变量类似?但是要区分开!变量名表⽰的是⼀个变量,但宏名表⽰的是⼀个常量。可以给变量赋值,但绝不能给常量赋值。
宏所表⽰的常量可以是数字、字符、字符串、表达式。其中最常⽤的是数字。
那么,程序中什么时候会使⽤宏定义呢?⽤宏定义有什么好处呢?我们直接写数字不⾏吗?为什么要⽤⼀个标识符表⽰数字呢?
宏定义最⼤的好处是“⽅便程序的修改”。使⽤宏定义可以⽤宏代替⼀个在程序中经常使⽤的常量。注意,是“经常”使⽤的。这样,当需要改变这个常量的值时,就不需要对整个程序⼀个⼀个进⾏修改,只需修改宏定义中的常量即可。且当常量⽐较长时,使⽤宏就可以⽤较短的有意义的标识符来代替它,这样编程的时候就会更⽅便,不容易出错。因此,宏定义的优点就是⽅便和易于维护。
那么程序在预编译的时候是怎么处理宏定义的呢?或者说是怎么处理预处理指令的呢?
其实预编译所执⾏的操作就是简单的“⽂本”替换。对宏定义⽽⾔,预编译的时候会将程序中所有出现“标识符”的地⽅全部⽤这个“常量”替换,称为“宏替换”或“宏展开”。替换完了之后再进⾏正式的编译。所以说当单击“编译”的时候实际上是执⾏了两个操作,即先预编译,然后才正式编译。#include也是这样的,即在预处理的时候先单纯地⽤头⽂件stdio.h中所有的“⽂本”内容替换程序中#include 这⼀⾏,然后再进⾏正式编译。
需要注意的是,预处理指令不是语句,所以后⾯不能加分号。这是很多新⼿经常犯的错误。#include 后⾯也没有加分号。
宏定义 #define ⼀般都写在函数外⾯,与 #include 写在⼀起。当然,写在函数⾥⾯也没有语法错误,但通常不那么写。#define 的作⽤域为⾃ #define 那⼀⾏起到源程序结束。如果要终⽌其作⽤域可以使⽤ #undef 命令,格式为:
#undef  标识符
undef 后⾯的标识符表⽰你所要终⽌的宏。⽐如前⾯在程序开头⽤ define 定义了⼀个宏 M,它原本的作⽤范围是⼀直到程序结束,但如果现在在程序中某个位置加了⼀句:
#undef M
那么这个宏的作⽤范围到此就结束了。#undef ⽤得不多,但⼤家要了解。
为了将标识符与变量名区别开来,习惯上标识符全部⽤⼤写字母表⽰。宏定义⽤得最多的地⽅是在数组中⽤于指定数组的长度。下⾯来写⼀个程序:
# include
# define NUM 5
int main(void)
{
int i, j = NUM;
int a[NUM] = {0};
printf("请输⼊%d个数:", j);
for (i=0; i
{
编程先学c语言还是pythonscanf("%d", &a[i] );
}
for (i=0; i
{
printf("%d\x20", a[i]);
}
printf("\n");
return 0;
}
输出结果是:
请输⼊5个数:5 4 3 2 1
5 4 3 2 1
NUM 是定义的宏,它表⽰的是其后的常量(⽽不是变量)。此外,程序中⽤双引号括起来的宏在预处理的时候是不会被宏替换的。因为在 C 语⾔中,⽤双引号括起来表⽰的是字符串。下⾯再写⼀个程序看⼀下:
# include
# 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;
}
输出结果是:
请输⼊圆的半径:1
s=PI*r^2 = 3.141590