null编译预处理编译预处理是C语言编译程序的组成部分,它用于解释处理C语言源程序中的各种预处理指令。
预处理命令
文件包含
宏定义
条件编译(自己看)编译预处理null文件包含(#include)和宏定义(#define)都是编译预处理指令
编译预处理指令的特点和作用
在形式上都以“#”开头,不属于C语言中真正的语句
增强了C语言的编程功能,改进C语言程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
环境,提高编程效率
1 、文件包含#include“文件包含”是指一个源文件可以将另一个源文件的全部内容包含进来。
在编译预处理时#include指令让预处理器在程序该点处加入指定文件内容,然后作为一个源文件编译形成新文件。1 、文件包含#includenull文件包含的一般形式为:
(1) #include <文件名>
(2) #include"文件名"
例如:#include
#include "stdio.h"
null将5个函数分别存储在2个.C文件上,要求通过文件包含把它们联结起来。常用标准头文件ctype.h 字符处理
math.h 与数学处理函数有关的说明与定义
stdio.h 输入输出函数中使用的有关说明和定义
string.h 字符串函数的有关说明和定义
stddef.h 定义某些常用内容
stdlib.h 杂项说明
time.h 支持系统时间函数 常用标准头文件2、 宏定义#define 一般语法:
#define
标识
采样口标识规范化 下载危险废物标识 下载医疗器械外包装标识图下载科目一标识图大全免费下载产品包装标识下载
符 字符串2、 宏定义#define 宏名宏的内容null(1) 定义符号常量(不带参数的宏)
#define 标识符 字符串
如:#define PI 3.14
预处理器将在源文件中搜索PI,并把每个PI替换成3.14。完成搜索和操作替换后,预处理器删除#define行。null(2) 定义宏
#define 宏名(参数
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
) 字符串
如: #define S(a , b) a * b
对程序中带有实参的宏(如S(3 , 4)),按#define命令中指定的字符串从左到右进行替换。如果字符串中包含宏的形参(如a , b),则将程序语句中相应的实参代替形参,如果宏定义中字符串中的字符不是参数字符(如a*b中的*)则原样保留
考虑s(3+4,5)如何替换?
3+4*5还是(3+4)*5?练习 练习 #include
#define S(n) n*n
void main()
{ int x=5;
printf("%d\n",S(x+2));
}
结果:17 #include
#define S(n) (n)*(n)
void main()
{ int x=5;
printf("%d\n",S(x+2));
}
结果:49null(3) 宏与函数
宏替换只占编译时间,不占运行时间。但函数调用时分配单元、传值、返回值时都占时间,特别是多次调用时尤为严重。
使用宏的程序代码较长,因为宏在程序中存在了多次,而使用函数时,虽然多次调用,但函数代码只存在一次。 null函数调用时先求实参表达式的值,再传给形参。而带参数的宏只是简单的字符替换,宏展开时并不对实参表达式求值。
函数调用时临时分配存储单元,宏替换并不分配存储单元,也没有返回值。例例
#define s1(a,b) a*b; /*定义宏*/
int s2(int a,int b) /*定义函数*/
{return a*b;}
#include
void main()
{int x,y,z1,z2;
scanf("%d,%d",&x,&y);
z1=s1(x+y,y); /*调用宏*/
z2=s2(x+y,y); /*调用函数*/
printf("z1=%d,z2=%d\n",z1,z2);
}
null宏参数是无类型的,而函数参数有严格的类型规定。例:
#define s1(a,b) a*b; /*定义宏*/
int s2(int a,int b) /*定义函数*/
{return a*b;}
在调用宏s1时a,b可以是任何类型(int,double,float,char等)
调用函数s2时只能是int示例1 用宏实现两个变量值的交换 #define f(a,b,t) t=a; a=b; b=t;
int main( )
{ int x,y,t ;
scanf(“%d%d” ,&x, &y);
f(x,y,t)
printf(“%d %d\n”, x, y) ;
return 0;
}t=x ; x=y ; y=t ;编译时被替换示例1 用宏实现两个变量值的交换把宏变成函数能实现该功能吗?不能!原因:单向传递null例: #define f(a) a*a*a
int main(void) /* 水仙花数 */
{ int i,x,y,z;
for (i=100; i<1000; i++)
{ x=i%10; y=i/10%10; z=i/100 ;
if (x*x*x+y*y*y+z*z*z==i)
printf(“%d\n” ,i);
}
return 0;
}#define f(a) (a)*(a)*(a)示例2:水仙花数:各位数字的立方和等于它本身的数。= x+y*x+y*x+y(f(x)+f(y)+f(z)==i)f(x+y) = (x+y)3 ?示例3 用宏定义实现求两数的最大
和求一数的平方示例3 用宏定义实现求两数的最大
和求一数的平方#include
#define MAX(a, b) (a) > (b) ? (a): (b)
#define SQR(x) (x) * (x)
int main (void)
{
int x , y;
scanf (“%d %d” , &x, &y) ;
x = MAX (x, y); /* 引用宏定义 */
y = SQR (x); /* 引用宏定义 */
printf(“%d %d\n” , x, y) ;
return 0;
}
示例4 嵌套宏定义#define F(x) x - 2
#define D(x) x*F(x)
int main()
{
printf("%d,%d", D(3), D(D(3))) ;
return 0;
}示例4 嵌套宏定义结果
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
阅读带宏定义的程序,先全部替换好,最后再统一计算
不可一边替换一边计算,更不可以人为添加括号
D(3) = x*F(x) 先用x替换展开
= x*x-2 进一步对F(x)展开,这里不能加括号
= 3*3-2 = 7 最后把x=3代进去计算
D(D(3)) = D(x*x-2) 先对D(3)用x替换展开,
= x*x-2* F(x*x-2) 拿展开后的参数对D进一步进行宏替换
= x*x-2* x*x-2-2 拿展开后的参数对F进一步进行宏替换
= 3*3-2*3*3-2-2 = -13 最后把x=3代进去计算
运行结果:7 -13结果分析null几点说明:
宏名一般用大写字母,以与变量名区别
宏定义不是C语句,后面不得跟分号
宏定义可以嵌套使用
#define PI 3.14
#define S 2*PI*PI
宏定义可以写在程序中任何位置,它的作用范围从定义
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
写处到文件尾。
练习:练习:定义宏LOWCASE,判断字符c是否为小写字母。
#define LOWCASE(c) (((c) >= 'a') && ((c) <= 'z') )
定义宏CTOD将数字字符(‘0’~‘9’)转换为相应的
十进制整数,-1表示出错。
#define CTOD(c) (((c) >= '0') && ((c) <= '9') ? c - '0' : -1)