第9章 预处理和标准函数.ppt
上传人:sy****28 上传时间:2024-09-15 格式:PPT 页数:25 大小:232KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

第9章 预处理和标准函数.ppt

第9章预处理和标准函数.ppt

预览

免费试读已结束,剩余 15 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第九章本章内容9.1预处理命令9.1.1宏定义1.简单的宏定义简单宏定义的一般形式为:#define标识符单词串作用域:从#define定义之后直到该宏定义所在文件结束。说明:#define行通常放在源程序开头部分,也可以放在源程序中任何位置,但必须出现在使用符号常量之前。例如:#defineYES1#defineNO0程序中用符号常量YES和NO代表1和0,在预编译时就会用1和0替换所有的YES和NO。注意:(1)通常用大写字母来定义宏名,以便与变量名区别。(2)宏替换只是简单的字符替换,不进行任何计算和语法检查。例如:#defineX1+2inty=3*X;预处理时,会用字符串“1+2”来替换宏名X,因此y的值应该为3*1+2,结果为5,而不是3*(1+2)=6。(3)双引号括起来的字符,即使与宏名相同,也不进行替换。例如:#defineOK1printf("OK");执行时输出的是OK,而不是1。(4)宏定义可以嵌套定义。例如:#defineR2.0#definePI3.14#defineSPI*R*R经预处理后,宏S将被3.14*2.0*2.0替换。2.带参数的宏定义带参数的宏定义的一般形式为:#define标识符(标识符1,标识符2,…)单词串例如:#definesqr(x)((x)*(x))#definemax(a,b)((a)>(b)?(a):(b))语句printf("sqr(%d)=%d\n",3,sqr(3));预编译时,此句将被替换成:printf("sqr(%d)=%d\n",3,((3)*(3)));执行后输出sqr(3)=9。语句printf("max(%d,%d)=%d\n",2,3,max(2,3));预编译时,将被替换成:rintf("max(%d,%d)=%d\n",2,3,((2)>(3)?(2):(3)));执行后输出max(2,3)=3。注意:在带参数的宏定义中,如果单词串是一个含有运算符的表达式,那么单词串中的每个参数都必须用圆括号括起来,并且整个表达式也要括起来。否则替换后的内容可能和原意不同。如将上例中sqr(x)的宏定义改为:#definesqr(x)x*x则表达式sqr(1+2)将被替换成:sqr(1+2*1+2)结果是5,而不是原意希望得到的9。3.取消宏名定义如果需要终止宏的作用域,可以使用#undef命令,取消宏名定义的形式为:#undef标识符要求:标识符应该是已定义过的宏名。例如:#undefPI表示在该命令后,PI是一个未定义的标识符,不再表示3.14。9.1.2文件包含文件包含命令有两种形式:#include<文件名>#include"文件名"功能:用指定文件的全部内容替换程序中该命令行,从而使指定的文件与当前源文件连成一个源文件。程序中需要引用标准库函数时,需要在源文件开头用文件包含命令包含库函数的头文件。例如:#include<stdio.h>#include<math.h>文件包含两种形式的区别:使用尖括号表示编译系统根据系统头文件存放的目录路径去搜索系统头文件,而不是在源文件目录去查找;使用双引号则表示编译系统首先在当前的源文件目录中查找,若未找到才根据系统头文件存放的目录路径去搜索系统头文件。用户编程时可根据自己文件所在的目录来选择某一种命令形式。一般来说,系统定义的头文件通常用尖括号,用户自定义的头文件通常用双引号。9.1.3条件编译功能:可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件,从而有利于程序的移植和调试。1.第一种形式#ifdef标识符程序段1#else程序段2#endif作用:如果标识符已被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译。如果程序段2为空,可以写为:#ifdef标识符程序段#endif【例9-2】已知a1=10,a2=-3、an=3an-1+an-2,求{an}前10项之和。#include<stdio.h>#defineDEBUGvoidmain(void){inta1=10,a2=-3,i,x,sum;sum=a1+a2;for(i=3;i<=10;i++){x=3*a2+a1;sum+=x;a1=a2;a2=x;#ifdefDEBUGprintf("x=%d,sum=%d\n",x,sum);#endif}printf("前10项和=%d\n",sum);}2.第二种形式#ifndef标识符程序段1#else程序段2#endif功能:如果标识符未被#define命令定义过,则对程