《第4章编译预处理与标准库函数 ppt课件.pptx》由会员分享,可在线阅读,更多相关《第4章编译预处理与标准库函数 ppt课件.pptx(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4章 编译预处理与标准库函数 第四章 编译预处理与标准库函数 本章内容4.1 宏定义宏定义4.2 文件包含文件包含4.4 C标准库函数标准库函数4.1 宏定义符号常量(不带参数)的宏定义用一个指定的标识符(即名字)来代表一个字符串,其一般形式为:#define 标识符标识符 字符串字符串其中,“define”为宏定义命令;“标识符”为所定义的宏名;“字符串”可以是常数、表达式、格式串等。宏定义的功能:在进行编译前,用“字符串”原样替换程序中的“标识符”。宏定义的作用:(1)便于对程序进行修改。(2)提高源程序的可移植性。 (3)减少源程序中重复书写字符串的工作量。【例】输入圆的半径,求圆的周
2、长、面积和球的体积。要求使用无参宏定义圆周率。#include #include #define PI 3.1415926 /*PI是宏名,3.1415926用来替换宏名的常数*/int main() double radius,length,area,volume; printf(Input a radius: ); scanf(%lf,&radius); length=2*PI*radius; /*引用无参宏求周长*/ area=PI*radius*radius; /*引用无参宏求面积*/ volume=PI*radius*radius*radius*3/4; /*引用无参宏求体积*/ p
3、rintf(length=%.2lf,area=%.2lf,volume=%.2lfn, length, area, volume); system(pause); return 0;说明: 为了和变量名加以区别,宏名一般用大写字母表示。但这并非是规定,也可使用小写字母。 宏定义是用宏名代表一个字符串,不管该字符串的词法和语法是否正确,也不管它的数据类型,即不作任何检查。如果有错误,只能由编译程序在编译宏展开后的源程序时发现。 在宏定义时,可以使用已经定义的宏名。即宏定义可以嵌套,可以层层替换。 在程序中,用双引号括起来的宏名被认为是一般字符,并不进行替换。 宏定义是专门用于预处理命令的一个专
4、用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。 宏定义也可用来定义多个语句,在宏调用时,把这些语句又替换到源程序内。 较长的定义在一行中写不下时,可在本行末尾使用反斜杠表示续行。宏替换不占运行时间,只占编译时间。而函数调用则占运行时间。带参数的宏定义语言允许宏带有参数。在宏定义中的参数称为形式参数(简称形参),在宏调用中的参数称为实际参数(简称实参)。对带参数的宏,在调用中,不是进行简单的字符串替换,而是进行参数替换。即不仅要宏展开,而且要用实参去替换形参。带参宏定义的一般形式为:#define 宏名(形参表) 字符串其中,字符串中包含有括号中所指定的参数。带参宏调用的一般形式
5、为:宏名(实参表);【例】已知有如下的定义:#define SQ(x) (x*x)#define CUBE(x) (SQ(x)*x)#define FIFTH(x) (CUBE(x)*SQ(x)求y = FIFTH(a)替换以后的展开式。求解过程如下: y = ( CUBE(x) * SQ(x) ); y =( (SQ(x)*x) * (x*x) ); y=( ( (x*x)*x) * (x*x) ); y=( ( (a*a)*a) * (a*a) )。说明: 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。 在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参
6、有具体的值,要用它们去替换形参,因此必须作类型说明,这是与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。而在带参宏中,只是符号替换,不存在值传递的问题。 在定义有参宏时,在所有形参外和整个字符串外,均应加一对圆括号。 定义带参宏时,宏名与左圆括号之间不能留有空格。否则,编译系统将空格以后的所有字符均作为替换字符串,而将该宏视为无参宏。 带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。 宏定义也可用来定义多个语句,在宏调用时,把这些语句又替换到源程序内
7、。 较长的定义在一行中写不下时,可在本行末尾使用反斜杠表示续行。宏替换不占运行时间,只占编译时间。而函数调用则占运行时间。取消宏定义宏定义的作用范围是从宏定义命令开始到程序结束。如果需要在源程序的某处终止宏定义,则需要使用#undef命令取消宏定义。取消宏定义命令#undef的用法格式为:#undef 标识符标识符其中的标识符是指定义的宏名。4.2 文件包含文件包含是指一个源文件可以将另一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。C语言提供了#include命令用来实现文件包含的操作。文件包含命令行的一般形式为:include 包含文件名包含文件名 或或 include 其中
8、:(1)使用双引号:包含文件名中可以包含文件路径,系统首先到当前目录下查找被包含文件,如果没找到,再到系统指定的“包含文件目录”(由用户在配置环境时设置)去查找。(2)使用尖括号:直接到系统指定的“包含文件目录”去查找。文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。说明:(1)在包含文件中不能有main( )函数。(2)编译预处理时,预处理程序将查找指定的被包含文件,并将其复制到#include命令出现的位置上。 (3)一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。(4)文件包含
9、允许嵌套,即在一个被包含的文件中又可以包含另一个文件。4.4 C标准库函数 C标准函数库的分类1字符判断和转换函数库2输入/输出函数库3字符串函数库4动态存储分配(内存管理)函数库5数学函数库6日期和时间函数库7其他函数库常用数学库函数tandouble tan(double x)计算tan(x)的值x的单位为弧度expdouble exp(double x)求ex的值logdouble log(double x)求logex,即lnxx0log10double log10(double x)求log10 xx0powdouble pow(double x, double y)计算xy的值sq
10、rtdouble sqrt(double x)计算x的平方根absint abs(int x)求整数的绝对值fabsdouble fabs(double x)求实数的绝对值函数名函数和形参类型功 能说 明sindouble sin(double x)计算sin(x)的值x的单位为弧度cosdouble cos(double x)计算cos(x)的值x的单位为弧度随机函数1rand( )函数rand( )函数原型:int rand(void);功能:返回0RAND_MAX之间的随机整数。在Visual Studio 2010环境下,RAND_MAX的值是32 767。默认的情况下,在程序的一次运
11、行过程中,第一次调rand( )时都是从一个种子数开始返回随机数的(例如41),然后以此数为基础,开始产生随机数序列,所以同一个程序的每次运行产生的随机数序列是一样的。为了使程序产生的随机数序列不同,需要改变第一个基础数,这时,就需要通过srand( )函数来设置。随机函数2srand( )函数srand( )函数原型:void srand (unsigned seed);功能:初始化随机数发生器,可以使随机数发生器rand( )函数产生新的随机序列。一般配合time( )函数使用,因为时间每时每刻都在改变,产生的seed值都不同。time( )函数的原型:unsigned time(NULL
12、); 此函数的功能是获取系统的当前时间,并返回一个无符号的整数,此整数是从1970/01/01到现在的秒数。用此函数时需要在程序的头部包含time.h头文件。利用随机函数要产生指定范围的随机数,其通常为公式int x = 1+rand( ) % n;可以生成1n之间的随机数,如1+rand( )%100表达式将产生1100之间的数字,也可以使用公式a+rand( )%(b-a+1) 来产生ab之间的数字。利用随机函数rand( )和srand( )来产生2个10,100的数字。#include #include #include int main() srand(time(NULL);int
13、num1 = 10+rand()%(100-10+1);int num2 = 10+rand()%(100-10+1);printf(%dn%dn ,num1,num2);system(pause);return 0;本章小结(1)符号常量(不带参数)的宏定义用一个指定的标识符(即名字)来代表一个字符串,其一般形式为:#define 标识符 字符串(2)带参宏定义的一般形式为:#define 宏名(形参表) 符串带参宏调用的一般形式为:宏名(实参表);(3)取消宏定义命令#undef的用法格式为:#undef 标识符本章小结(4)文件包含命令行的一般形式为:include “包含文件名” 或 include 其中: 使用双引号:包含文件名中可以包含文件路径,系统首先到当前目录下查找被包含文件,如果没找到,再到系统指定的“包含文件目录”(由用户在配置环境时设置)去查找。 使用尖括号:直接到系统指定的“包含文件目录”去查找。一般来说,使用双引号比较合适。(5)常用的函数及其对应的库名。(6)随机函数rand( )和srand( )的使用方法。