函数声明是对所用到的函数的特征_第1页
函数声明是对所用到的函数的特征_第2页
函数声明是对所用到的函数的特征_第3页
函数声明是对所用到的函数的特征_第4页
函数声明是对所用到的函数的特征_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、继续教学目的与要求 掌握函数的定义与调用方法,函数参数的传递方式 变量存储类型及变量的生存期和有效范围 掌握函数的嵌套调用与递归调用 了解带参数的main函数 继续重点与难点重点: 函数定义 函数调用 函数声明等基本概念 函数的嵌套调用与递归调用 数组作为函数的参数 变量的存储类别与作用域难点: 函数参数的值传送与地址传送 函数的递归调用 静态变量 返回模块化程序设计 模块化程序设计就是进行大程序设计的一种有效措施,其基本思想是:大的程序功能分割模块C提供如下一些支持模块化软件开发的功能:(1)函数式的程序结构程序整体由一个或多个函数组成。每个函数都具有各自独立的功能和明显的界面。(2)允许通

2、过使用不同存储类别的变量,控制模 块内部及外部的信息交换。(3)具有编译预处理功能,为程序的调试、移植 提供了方便,也支持了模块化程序设计。返回函 数 C程序结构 函数的概述 函数的定义与函数声明 函数的调用继续C 程 序 结 构 用C语言设计程序,任务只有一种,就是编写函数,至少也要编写一个main( )函数。执行C程序就是执行相应的main( )函数。 main( ) f1( ) ;f2( ) ; f1( ) f11( ) ; f2( ) f21( ) ;f22( ) ; f11( ) f21( ) f22( ) 返回C 程 序 结 构 高级语言中“函数”的概念和数学中“函数”的概念不完全

3、相同。高级语言中的“函数”实际上是“功能”的意思。fun( )输入输出自顶向下、逐步细化的程序设计方法。main( )f1( )f2( )f11( )f21( )f22( )继续函 数 的 概 述 调用其他函数的函数被称为主调函数,被其他函数调用的函数称为被调函数。说明:1. 主调函数调用其他函数。2. 其他函数之间也可互相调用。3. 同一个函数可被一个或多个函数调用任意次。4. 一个源程序文件可由一个或多个函数组成。5. 使用函数时只需关心函数的功能和使用方法, 不关心其内部的具体实现。继续函 数 的 概 述例:main( ) func1( ); printf(“1.hello,worldn

4、”); func1( ) func2( ); printf(“2.hello,worldn”); func2( ) printf(“3.hello,worldn”); /*调用func1函数*/*func1函数的定义*/返回函 数 的 概 述在编写函数时,应注意:(1)界面清晰。函数的处理子任务明确,函数之间数据传递越少越好。(2)大小适中。函数太大,处理任务复杂,导致结构复杂,程序可读性差;反之,函数太小,则程序调用关系复杂,降低程序的效率。返回函数的定义与函数声明 定义函数就是在程序中设定一个函数模块。一个函数是由变量声明部分与可执行语句组成的独立实体,用以完成一指定的功能。 函数声明是对

5、所用到的函数的特征进行必要的声明。编译系统以函数声明中给出的信息为依据,对调用表达式进行检测,以保证调用表达式与函数之间的参数正确传递。 函数定义 函数声明继续函 数 定 义 函数定义的形式为:类型说明符 函数名(形参类型 形参,形参类型 形参,) 数据说明部分; 执行语句部分;函数体说明:1. 函数名函数名应符合C语言对标识符的规定。继续函 数 定 义2. 形式参数 形式参数写在函数名后面的一对圆括号内,它有两个作用:(1)表示将从主调函数中接收哪些类型的信息。有些 函数没有形式参数。这时,主函数main后面的圆 括号内可以空,其它函数应该在圆括号内写上void 以声明它为空。(2)在函数体

6、中形式参数是可以被引用的,可以输入、 输出、被赋以新值或参与运算。 程序进行编译时,并不为形式参数分配存储空间。只有在被调用时,形式参数才临时地占有存储空间,从调用函数中获得值,这称为“虚实结合”,形参从相应的实参得到值。继续函 数 定 义例:定义了一个函数fun: fun(int a , int b) 当它在main函数中用语句(设x,y已被赋值3,4)t=fun(x , y); 调用时,虚实结合的情况如图所示。main函数x 3y 4(实参)fun函数a 3b 4(形参)注意:形式参数的名字并不重要,关键在它们的数量及类型。继续函 数 定 义3. 函数体函数体变量定义(即数据说明)语句(即

7、执行语句)说明:在函数体中定义的变量只有在执行该 函数时才存在。函数体中也可以不定义变量而只有语 句,也可以二者皆无。如:void null(void) 继续函 数 定 义4. 函数的返回函数执行的最后一个操作是返回。返回的意义是:(1)使流程返回主调函数,宣告函数的一次执行 终结,在调用期间所分配的变量单元被撤销。(2)送函数值到调用表达式中。有些函数有返回 值,有些函数可以没有返回值。例:求一个整数的绝对值的函数。int absolute_value(int x) return(x=0?x:-x);return语句返回一个表达式的值继续函 数 定 义例:打印n个空格的函数。void spc

8、(int n) int i ; for(i=0;in;i+) printf(“ “); return;不返回任何值到调用函数中允许将该return语句省去可以将流程返回调用函数改写为:void spc(int n) int i ; for(i=0;in;i+) printf(“ “); 如果return语句后面不带表达式则不返回任何值,仅将流程转回主调函数。继续函 数 定 义 在一个函数中允许有一个或多个return语句,流程执行到其中一个return时即返回主调函数。例:对表达式y=x2-x+1 (x0)x3+x+3 (x0)可以写出一个函数: float y (float x) if (

9、x10) return (2*n+3); else return; 在编译时将给出警告: Both return and return of a value used in!继续函 数 定 义5. 函数的类型 函数的类型是指函数返回值的类型,即函数定义时所指出的类型。 函数在返回前要先将表达式的值转换为所定义的类型,返回到主调函数中的调用表达式。注意:(1)int 型与char 型函数在定义时可以不 定义类型(即不写int 或char),系 统隐含指定为int型。(2)对不需要使用函数返回值的函数, 应定义为void类型。返回函 数 定 义6. 函数定义的外部性 函数不能嵌套定义,一个函数不能

10、定义在别的函数的内部。 func1 ( ) func2 ( ) 只能写成: func1 ( ) func2 ( ) 一个程序如果用到多个函数,允许把它们定义在不同的文件中,也允许一个文件中含有不同程序中的函数。继续函 数 声 明 所谓“声明”是指向编译系统提供必要的信息:函数名,函数的类型,函数参数的个数、类型及排列次序,以便编译系统对函数的调用进行检查。函数声明的一般格式为:类型标识符 函数名(类型标识符 形参,类型标识符 形参,); 这些信息就是函数定义中的第一行(称函数头)的内容,也称函数模型(或函数原型)。继续函 数 声 明设有一函数的定义为: double func ( double

11、 a , int b , float c) /*函数体*/ 与之相应的函数声明应为: double func ( double x , int y , float z ) ;也可以不写形参名: double func (double , int , float ) ;但不能只写形参名而不写类型:double func ( x , y , z ) ;也不能不写函数的类型:func ( double x , int y , float z ) ;注意:只有函数返回值为int或char时,函数类型标识符才可以省略。形参的次序也不能写错,不能写成: double func ( int y , floa

12、t z , double x ) ;继续函 数 声 明注意:(1)函数的调用遵循“先定义,后调用”原则。 若被调用函数的定义在主调函数之后出 现,就必须在主调函数中对被调用函数 加以声明;反之,则无需声明。(2)若在所有函数之前声明了函数原型,则 该函数原型在本程序文件中任何地方都 有效。返回函 数 声 明例如:float f ( float x , int y ); main( ) fun1( ) f(a,b); fun2( ) f(c,d); float f ( float x , int y ) /*放在所有函数之前,作统一声明*/返回函 数 的 调 用 函数调用的一般形式 函数的传值调

13、用 函数的嵌套调用 函数的递归调用返回函数调用的一般形式 调用子函数的形式 函数的调用方式 对被调用函数的说明 函数调用的执行过程继续调用子函数的形式声明了函数原型后,便可以按如下形式调用子函数:函数名(实参表)说明:(1)实参表中实参的个数多于一个时,各 参数之间使用逗号分隔。(2)实参的个数、类型必须与对应的形参 一致。(3)Turbo C系统按自右向左的顺序求值。返回调用子函数的形式例:main ( ) int x=10; int y=x+; printf(“%d , %d”, (x+ , y ), y+); 注意:不要将函数参数的计算次序与一般表达式 计算相混淆。返回函数的调用方式可以

14、用三种方式调用函数:(1)函数表达式。必须有一个明确的返回值,可以出现在任何允许表达式出现的地方,参与运算。例如:y=power(2,3);(2)一条独立函数调用语句。例如:func1( ); printf(“%d”, a );(3)函数参数。例如:y=pow(5 , pow(4 , 3) );返回对被调函数的说明(1)对用户自定义函数在某些情况下需要进行 函数说明。(2)对于系统标准函数(库函数),一般注意 相关的头文件。例如:对于字符串操作的函数, 使用#include 对于数学函数, 使用#include 返回函数调用的执行过程main( )func( )结束返回func ( )例:编写

15、一个求a的n次方的函数。double power(double a , int n );main( ) printf(“6 to the power 3 is %f”, power(6.0, 3); double power(double a , int n ) double sval=1.0; while(n-) sval*=a; return(sval);运行结果为: 6 to the power 3 is 216.000000继续函数的传值调用 实参是调用函数中的变量,形参是被调函数中的变量。在函数调用过程中实现实参与形参的结合。 在c程序中,采用变量参数时,实参与形参是按传值方式相结合

16、的,也称为传值调用方式。传值调用的过程:(1)形参与实参各占一个独立的存储空间。(2)形参的存储空间是函数被调用时才分配的。实参xy34形参ab “值结合”(3)函数返回时,临时存储区也被撤销。34继续函数的传值调用 传值调用的特点是:函数中对形参变量的操作不会影响到调用函数中的实参变量,即形参值不能传回给实参。例:main( ) int a=3 , b=5; void swap ( int x , int y ); swap(a , b ); printf(“a=%d, b=%d n”, a, b ); void swap(int x , int y ) int temp; temp=x;

17、x=y; y=temp; printf(“x=%d, y=%d n”, x, y); 执行结果: x=5,y=3 a=3,b=5继续函数的传值调用说明:(1)传值调用方式,函数只有一个入口 实参传值给形参,一个出口函数返 回值。(2)实参与形参在个数、类型上要匹配。(3)函数声明的作用是为编译系统对参数进 行类型检查提供依据,并且在出现同名 函数时,系统将根据类型和参数不同, 对它们加以区别。返回函数的传值调用例:main( ) float add(unsigned int a , unsigned int b ); float x=1.5, y=-5.7; printf(“%f+%f=%fn

18、”, x, y, add(x,y); float add(unsigned int a , unsigned int b ) printf(“a=%u , b=%u n”,a , b ); return(a+b); 返回函数的嵌套调用 函数允许嵌套调用,即:在调用一个函数的过程中又调用另一个函数。注意:主函数main不可被其他任何函数调用。 例如,f1和f2是分别独立定义的函数,互不从属,但在调用f1的过程中又要调用函数f2。其调用过程如图:main函数 u=f1(i , t); f1函数 c=f2(b-1 , b+1);f2函数返回f2函数值函数的递归调用 函数可以直接或间接地调用自身,称为

19、递归调用。前者称为直接递归调用,后者称为间接递归调用。 递归的实质:把需要求解的问题转换成与原有问题类似的问题,按这一原则将问题分解下去,最终分解出来的问题是一个已知解的问题,这便是有限的递归。 递归的主要优点:使程序容易编制,可读性强,在算法上简单,代码紧凑。递归的缺点:并不节省空间,运行效率不高。 注意:每个递归过程都必须有一个“出口”,函数变化的趋势应靠近该出口,避免陷入无限循环。继续函数的递归调用 递归的过程有两个阶段: 第一阶段:递推。将原问题分解成新的问题,最终到达已知条件,递推阶段结束。 第二阶段:回归。从已知的条件出发,按照递推的逆过程,逐一求值回归,最后到达递推的开始处,结束

20、回归阶段,完成递归调用。继续函数的递归调用 例:递归计算n!的函数rfact( ) 。 long rfact( int n ) if ( n1)变量的存储属性继续C语言程序占用的存储空间通常分三部分:程序区静态存储区动态存储区1. 变量的存储器类型存储器内存储器(主存)内存条外存储器(辅存)光驱、磁盘等寄存器临时存储器 C语言允许程序员区分是在主存中还是在寄存器中开辟变量存储空间。变量的存储属性继续2. 变量的生存期(存在性)C语言中的变量可以用两种方式建立:(1)在编译时分配存储单元,程序执行开始后这种 变量即被创建,程序执行结束即被撤销。永久存储(2)只在程序执行的某一段时间内存在。 例如

21、:函数的形参和在函数体或分程序中定义 的变量。动态存储变量的存储属性继续3. 变量的可用域(可见性)变量的可用域也可以分为两种: 全局可用与局部可用。 在C语言中,用“存储属性”来表示以上三个方面的属性。并且把它们分为四类:register, auto, static, extern。存储属性registerautostaticextern存储位置寄存器主 存生存期动态生存期永久生存期作用域局部局部或全局全局 C语言要求,在定义一个变量时,除了指定其数据类型以外,还可以指定其存储类别。例如:register int a;int a ;变量的存储属性返回 动态变量 静态变量 外部变量动 态 变

22、量返回 动态变量是在程序执行的某一时刻被动态地建立并在另一时刻被动态地撤销的一种变量,它们存在于程序的局部,也只在这个局部中可以使用。动态变量有两种: 自动(auto)变量 寄存器(register)变量自 动 变 量继续 因为建立和撤销这些变量都是由系统在程序执行过程中自动进行的,所以称为自动变量。 当程序的一个局部要使用某些自动变量时,应当在使用之前先按如下形式进行说明:auto 数据类型 变量名 =初值表达式,;注意:如果省略auto,系统隐含认为此变量为auto。自 动 变 量继续1. 自动变量是局部变量。自动变量只在定义它的那个局部才能使用。 例如,函数变量x例:main( ) in

23、t x=1; void prt(void); int x=3; prt( ); printf(“2nd x=%dn”, x ); printf(“1st x=%dn”, x); void prt(void) int x=5; printf(“3th x=%dn”, x ); 说明:C语言规定,如果内层 与外层有相同名字的 变量,则在内层范围内 只有内层的变量有效, 外层的同名变量在此范 围内无效,或者说,外 层的变量被内层的同名 变量“屏蔽”掉了。自 动 变 量继续注意:1. 可以把临时变量定义在需要用到它的局部内。2. 使用自动变量有以下好处:(1)“用之则建,用完即撤”,可以节省大量 存储

24、空间。(2)程序员无须关心程序的其它局部使用了 什么变量,可以独立地给本区域命名变 量。(3)在一个局部中定义所需用的变量,便于 阅读、理解程序。自 动 变 量继续2. 在对自动变量赋值之前,它的值是不确定的。例:使用未赋初值的自动变量。 main( ) int i; printf(“i=%dn”,i);注意: 对于自动变量,必须对其赋初值后,才能引用它。自 动 变 量返回3. 对同一函数的两次调用之间,自动变量的值是不 保留的,因为其所在的存储单元已被释放了。例:多次调用同一个函数,测试其中的自动变量的值。 main( ) int i; int count(int n); for(i=1;i

25、=3;i+) count(i); int count(int n) int x; printf(“%d: x=%d,”, n, x ); x+=2; printf(“x+2=%dn”,x );运行结果为: 1: x=1, x+2=3 2: x=2, x+2=4 3: x=3, x+2=5说明:1. 自动变量的生存期从函数被 调用开始,到函数调用返回 结束。2. 函数的形参也是一种自动变 量,但是在说明时不加存储 类型标识符“auto”。寄 存 器 变 量继续特点:1. 具有与自动变量完全相同的性质。2. 被系统存放在CPU中的一个寄存器中。3. 通常把使用频率较高的变量定义为register

26、类别。寄 存 器 变 量继续例:有一个函数:#include void m_table(void) register int i , j ; for(i=1;i=9;i+) for(j=1;j=i;j+) printf(“%d * %d =%2d ”, j, i,j*i ); putchar(n); main( ) void m_table(void); m_table( );寄 存 器 变 量函数的形参也可以使用寄存器变量,如:func(register int part1, register int part2) 说明:(1)并不是所有的寄存器变量都能够保存在寄存器中。 能够保存在寄存器中

27、的变量的数据类型只有 char,short,int,unsigned int和指针类型。(2)静态局部变量和全局变量不能存储在寄存器中, 也就是说寄存器不能以静态方式存储变量。(3)Turbo C将寄存器变量作自动变量处理,在内存中 分配存储空间,并非真把它们放到寄存器,所以 一般很少使用寄存器变量。返回静 态 变 量继续说明:(1)静态变量的存储空间在程序的整个运行 期间是固定的(static)。一个变量被指定为静态(固定),在编译时就为其分配存储空间,程序一开始执行便被建立,直到该程序执行结束都是存在的。(2)静态变量的初始化是在编译时进行的。在定义时只能使用常量或常量表达式进行显式初始化

28、。未显式初始化时,编译将把它们初始化为0(对int型)或0.0(对float型)。静态变量的定义采用下面的格式:static 数据类型 变量名初始化常数表达式,;静 态 变 量继续注意:只有静态变量和外部变量才是在编译时 被创建的,才有初始化问题。所以对自 动变量称为“赋初值”,而对静态变量和 外部变量称为“初始化”,以示区别。(3)在函数多次被调用的过程中,静态局部变量 的值具有可继承性。静 态 变 量继续例:比较下面两个程序。 main( ) void increment(void); increment( ); increment( ); increment( ); void incre

29、ment(void) int x=0; x+; printf(“%dn”, x );运行结果:1 1 1(变量x的值未被继承) main( ) void increment(void); increment( ); increment( ); increment( ); void increment(void) static int x=0; x+; printf(“%dn”, x ); 运行结果:1 2 3(变量x的值被继承)赋初值初始化,只进行一次静 态 变 量(4)静态局部变量的值只能在本函数(或分程序) 中使用。在一个函数(或分程序)中定义的变量是局部变量,它们只能在其局部范围内被引用

30、。注意:1. static类别变量在函数调用结束后其存储单元 不释放,其值具有继承性。2. 生存期(存在期)表明变量的存储空间在什 么时期存在,而作用域表明变量在程序哪个 语句区间可以使用,二者不可混淆。3. 定义静态局部变量只是为了在多次调用同一 函数时使变量能保持上次调用结束时的 结果。返回外 部 变 量返回 外部变量是全局变量 外部变量使用的几种情况 外部变量的副作用外部变量是全局变量继续 在一个文件中,定义在所有函数之外的变量称为外部变量。例如:int a=3,b=5; main( ) printf(“%d, %d n”,a,b); fun(void) printf(“%d, %d n

31、”,a,b); /*外部变量*/全程有效外部变量是全局变量继续注意:在一个函数中改变了外部变量的值,那么其后 引用该变量时,得到的是已被改变的值。例:交换两个变量的值。 int a=3,b=5; main( ) void fun(void); printf(“a=%d, b=%d n”,a,b); fun( ); printf(“a=%d, b=%d n”,a,b); void fun(void) int c; c=a;a=b;b=c; 运行结果: a=3, b=5 a=5, b=3外部变量是全局变量返回注意:外部变量也可以不出现在文件开头,而出现在 两个函数之间。例如:main( ) f1(

32、 ) int a, b; f2( ) float x, y; f3( ) 外部变量的作用域从其定义点开始到本文件末尾。 a, b作用域x, y作用域外部变量使用的几种情况继续1. 限定本文件的外部变量只在本文件使用如果有的外部变量只允许本文件使用而不允许其它文件使用,则可以在此外部变量前加一个static,使其有限局部化,称作静态外部变量。例:static int a=3, b=5; main( ) f1( ) f( ) 外部变量使用的几种情况继续注意:(1)外部变量是在编译时分配存储单元的, 它也不随函数的调用与退出而建立和 释放,也就是它的生存期是整个程序 的运行周期。(2)在内存的数据区

33、分两个部分:静态存 储区和动态存储区。自动变量和形参 存放在动态存储区,而静态局部变量 和所有的外部变量存放在静态存储区 中。 使用静态外部变量的好处是:当多人分别编写一个程序的不同文件时,可以按照需要命名变量而不必考虑是否会与其它文件中的变量同名,以保证文件的独立性。外部变量使用的几种情况继续对局部变量和全局变量的归纳定义位置存储方式存储区域存储时间全局变量外部变量静态存储区程序运行全过程静态外部变量局部变量静态局部变量自动变量动态存储区调用函数全过程寄存器变量寄存器外部变量使用的几种情况继续例:产生一个随机数的函数。采取以下公式来产生一个随机数序列:r=(r*123+59)%65536,只

34、要给出一个r的初值,就能计算出下一个r(值在065535范围内)。static unsigned int r;random(void) r=(r*123+59)%65536; return(r);unsigned random_start(unsigned int seed) r=seed; main( ) int i, n ; printf(“please enter the seed : “); scanf(“%d” , &n); random_start(n); for(i=1;i10;i+) printf(“%u”, random( );外部变量使用的几种情况继续注意:(1)把产生随机

35、数的两个函数和一个静态外部 变量单独组成一个文件,单独编译。(2)在编写程序时,往往将用到某一个或几个 静态外部变量的函数单独编成一个小文件。(3)可以将这个文件放在函数库中,用户可以 调用函数,但不能使用其中的静态外部变 量(这个外部变量只供本文件中的函数使 用)。(4)static存储类别可以使我们能建立一批可供 放在函数库中的通用函数,而不致引起数 据上的混乱。外部变量使用的几种情况继续2. 将外部变量的作用域在本文件范围内扩充对于位于定义点之前的函数,可以用extern说明符使变量的作用域扩充到需要用到它的函数。例:利用extern声明,扩充外部变量的作用域。 main( ) void

36、 gx( ), gy( ) ; extern int x , y ; printf(“ 1 : x=%d y=%d n”, x , y ); y=246; gx( ); gy( ); void gx( ) extern int x , y ; x=135; printf(“ 2 : x=%d y=%d n”, x , y ); int x , y ; void gy( ) printf(“ 3 : x=%d y=%d n”, x , y );本函数中要用到的x,y是在本函数之外的外部变量运行结果:1 : x=0 y=02 : x=135 y=2463 : x=135 y=246外部变量使用的几

37、种情况继续 除了可以在函数内用extern说明变量以外,还可以将它写在函数之外,以扩充作用域,如上例可改写为:extern int x , y ;main( ) void gx( ) int x , y ;void gy( ) x,y原作用域 x,y的新作用域注意:(1)对变量的定义在一个文件中只能有一次,而对变量 的声明可以有多个。(2)定义变量是分配内存单元,声明变量只是通知 编译系统一个信息:“此变量到外部去找”。外部变量使用的几种情况返回3. 还可以将外部变量的作用域扩充到其它文件例:例:file 1. c int x , y; char ch; main( ) x=12; y=24;

38、 f1( ); printf(“%c”, ch ); 注意:(1)操作的先后顺序,只有先赋值才能引用。 这时在需要用到这些外部变量的文件中对变量用extern作声明即可。 file 2. c extern int x , y; extern char ch; f1( ) printf(“%d, %dn”, x , y); ch=a; (2)在file2.c文件中不能再定义“自己的外部变量” x,y,ch,否则就会犯“重复定义”的错误。外部变量的副作用继续例:int i; main( ) void prt( ); for(i=0;i5;i+) prt( ); void prt( ) for(i=

39、0;i5;i+) printf(“%c”, *); printf(“n”); 运行结果:* * * * *而程序设计者本来试图打印一个由“*”组成的55的方阵: * * * * * * * * * * * * * * * * * * * * * * * * *外部变量的副作用返回 各模块之间除了用参数传递信息之外,还增加了许多意想之外的渠道,造成模块之间的联系太多,对外部的依赖太多,降低了模块的独立性,给设计、调试、排错、维护都带来困难。 此外,它无论是否使用,程序执行时都占用固定的空间。因此,在程序设计时应有限制地使用外部变量。编 译 预 处 理返回 编译预处理是在编译前对源程序进行的一些预

40、加工。预处理由编译系统中的预处理程序按源程序中的预处理命令进行。 C语言的预处理命令均以“#”打头,末尾不加分号,以区别于C语句。它们可以出现在程序中的任何位置,其作用域是自出现点到所在源程序的末尾。宏定义分为两种形式: 符号常量定义 带参数的宏定义符 号 常 量 定 义继续 为了提高程序的可读性,可以使用宏定义,用宏名来表示常量。 定义符号常量的一般形式:# define 宏名 字符串符合对标识符命名的规则,习惯上用大写宏体注意:(1)预处理时,将把程序中该宏定义之后的 所有宏名用宏体替换。(2)宏定义属于编译预处理命令,不是语 句,所以不需要在行末加分号。符 号 常 量 定 义继续 例如: # define YES 1 对于宏定义,编译时只作简单的字符置换。如果程序中的预处理命令有错,只能在真正的编译阶段才可检查出来。# define SP scanf(“%d”, &x); printf(“%dn”, x);符 号 常 量 定 义继续例:从键盘连续读入字符,并统计其中数字的个数, 直到读入ESC字符为止。# inclu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论