C语言课件(4,5)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
main( ) { int x=1; { void prt(void); int x = 3; prt( ); printf(―2nd x = %d\n‖,x); } printf(―1st x = %d\n‖,x); } void prt (void) { int x = 5 ; printf(―3th x = %d\n‖,x) }
第 四章
模块化程序设计
7. 函数的嵌套调用及递归调用 •嵌套调用:在一个函数中又调用另外一个 函数。 函数不允许嵌套定义,但可以嵌套调用!
main 函数 { u=f1(i,t); } 1 7 f1 函数 { 2
c=f2(b-1,b+1);
f2 函数 3 5 4
返回f2函数值
} 6
第 四章
模块化程序设计
第 四章
模块化程序设计
② 外部变量使用的几种情况: ⅰ 限定在本文件的外部变量只能在本文件使用; 如果有的外部变量只允许本文件使用而不允 许其他文件使用, 则可以在此外部变量前加 static,使其有限局部化,称为静态外部变量。
static int a = 3, b = 5; main( ) { …} f1( ) { …}
第 四章
模块化程序设计
ⅲ 将外部变量作用域扩充到其他文件:在需 要用到这些外部变量的文件中对变量用extern 作声明。 file1.c file2.c
int x , y; char ch; main( ) { … x = 12; y = 24; f1( ); printf(―%c‖,ch); } extern int x , y ; exturn char ch; f1( ) { printf(―%d, %d\n‖,x ,y); ch = ‗a‘; }
第 四章
三 编译预处理
模块化程序设计
编译预处理是在编译前对源程序进行的一些 加工。 预处理是由编译系统中的预处理程序按源程 序中的预处理命令进行的。 C语言的预处理命令均以“#‖打头,末尾不 加分号,以区别于C语句。 编译预处理命令可以出现在程序中的任何位 置,其作用域是自出现点到所在的源程序的 末尾。
第 四章
模块化程序设计
③ 外部变量的副作用。
int i ; main( ) { void prt( ); for( i = 0; i<5;i++) prt( ); } void prt( ) { for (i =0 ; i<5;i++) printf(―%c‖, ‗*‘); printf(―\n‖); }
第 四章
例 float y(float x) { if (x<0) return(x*x-x+1); else return(x*x*x+x+3); }
模块化程序设计
虽然,这里有两个return语 句,但是,每调用一次, 只有一个return语句有效。 另外,要求两个return语句 后的表达式类型要相同。 (为什么?)
第 四章
模块化程序设计
6. 函数的调用:使用函数的功能。 变量参数:传值 参数 指针参数:传址
第 四章
形参:
虚 实 结 合
模块化程序设计
被调函数,表示将从主调函数中获得哪 些类型的信息。
实参: 主调函数,向被调函数传递必要信 息。
第 四章
假定函数fun: fun(int a, int b) { … } main( ) { int x=3,y=4; t = fun(x, y ); }
第 四章
main( ) { void increment (void); increment( ); increment( ); increment( ); } void increment (void) { int x=0; /*auto*/ x + +; printf(“ %d\n”, x); }
第 四章
模块化程序设计
例 求一个整数的绝对值的函数。 int absolute_value( int x) 形参 { return(x>=0?x:-x); }
当调用结束时,如果需要 函数提供一个运算结果的 话,就需要用return语句 来带回该值。
第 四章
模块化程序设计
例 打印n个空格的函数。 void space(int n) { 如果不要求函数在运算结束提 供值的时候,对于函数类型就 int i; 可以选择void型。 for (i=0; i<n; i++) printf(“ ”); 此时,return函 return; 数不带回任何值。 }
第 四章
模块化程序设计
(2) 静态变量的初始化是在编译时进行的。在 定义时只能使用常量或常量表达式进行显式 初始化。未显式初始化时,编译将把它们初 始化为0(int 型)或0.0(float 型)。 (3) 在函数多次被调用的过程中,静态局部变 量的值具有可继承性。 (4) 静态局部变量的值只能在本函数(或分程 序)中使用。
第 四章
一 函数
模块化程序设计
main函数
C程序
其他函数
库函数
用户自定义函数
第 四章
模块化程序设计
1. 函数与函数之间的调用关系
第 四章
2. 函数基本组成
模块化程序设计
函数返回值类型 函数名(参数列表)
{ 函数体; }
第 四章
3 函数定义 函数类型
模块化程序设计
函数名 形式参数数目、类型 函数体
模块化程序设计
main( )
函数
x
3
y 4
(实参)
fun( ) 函数
a
3
x b
(形参)
第 四章
模块化程序设计
注意: 1. 形参与实参各占一个独立的存储空间。 2. 形参的存储空间是函数被调用时才分配的。 调用开始,系统为形参开辟一个临时存储 区,然后将各实参之值传递给形参,这时 形参就得到了实参的值。 3. 函数返回时,临时存储区也被撤消。 4. 传值方向只能由实参向形参传递,而不能 由形参向实参传递。即值传递是单向传递。 也就是说,形参的改变,不会影响实参的 值。
第 四章
1 宏替换
模块化程序设计
宏替换是预处理命令#define指定的预处理。 ① 字符串替换 在程序中可以用#define命令定义字符串宏替 换:
#define 宏名 宏体
第 四章
模块化程序设计
其中宏名与宏体均为字符串。预处理时,将 把程序中该宏定义之后的所有宏名用宏体替 换。符号常数的定义就是这种宏定义的一种 应用。 在这种定义情况下,编译系统在进行预处 理的时候,仅仅只是将宏体来简单的替换宏 名,并不作任何其它操作。
第 四章
模块化程序设计
ⅱ 将外部变量的作用域在本文件范围内扩充 扩充到定义点之前的某个函数 扩充到定义点之前的所有位置 注意: extern只是说明该变量是一个外部变量,当 需要的时候,应该在外部变量中去找,而不 是重新分配存储空间。
第 四章
模块化程序设计
main( ) { void gx( ), gy( ); extern int x, y; /*声明x, y为外部的*/ printf(―1:x=%d\t y=%d\n‖ , x, y); y = 246; gx( ); gy( ); } void gx( ) { extern int x, y; /*声明x, y为外部的*/ x = 135; printf(―2:x=%d\t y=%d\n‖ , x, y); } int x, y; /*定义x, y是外部变量*/ void gy( ) { printf(―3:x=%d\t y=%d\n‖ , x, y); }
第 四章
5. 函数的声明
模块化程序设计
如果函数的定义出现在函数调用之后,则对 将要调用的函数作一个声明,即向编译系统 提供函数必要的信息:函数名,函数类型, 函数参数个数、类型及排列次序。
类型标识符 函数名(类型标识符 参数1,…); 当一个函数要被一个文件中的多个函数调用 时,可以将该函数的声明写在所有函数之前。
prt
x=5 printf(“3th x = %d\n”, x);
第 四章
模块化程序设计
② 寄存器变量:具有与自动变量完全相同的 性质。 2 静态变量 “静态”是相对于“动态”而言的。 (1) 静态变量的存储空间在程序的整个运行 期间是固定的(static) 。一个变量被指定为静 态变量,则在编译时就为其分配存储空间, 程序一开始执行便被建立,直到该程序执行 结束都是存在的。
第 四章
二 变量的存储属性
模块化程序设计
变量的值
变量 变量的操作属性 变量的存储属性 变量存储器位置 变量生存期
变量可用域
第 四章
1 动态变量
模块化程序设计
动态变量是在程序执行的某一时刻被动态地 建立并在另一时刻被动态地撤消的一种变量, 它们存在于程序的局部,也只在这个局部中 可以使用。动态变量有两种:自动(auto)变量 和寄存器(register)变量。 ① 自动变量 [auto] 数据类型 变量名[=初值表达式],…;
第 四章
模块化程序设计
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,x=y,y=temp; printf(―x=%d, y=%d\n‖,x, y); }
第 四章
3 外部变量
模块化程序设计
在一个文件中,定义在所有函数之外的变量称 为外部变量。 ① 外部变量是全局变量:从定义它的位置开 始到文件结束。
当在程序中某个地方改变了外部变量的值,那 么,在后面任何地方引用该外部变量,都是引 用的改变过后的值。
第 四章
模块化程序设计
int a = 3, b= 5; main( ) { void swap (void); printf(― a = %d, b = %d\n‖, a, b); swap( ); printf(― a = %d, b = %d\n‖, a, b); } void swap(void ) { int temp; temp = a; a = b; b = temp; }
模块化程序设计
main( ) { void increment (void); increment( ); increment( ); increment( ); } void increment (void) { static int x=0; /*static*/ x + +; printf(“ %d\n”, x); }
第 四章
模块化程序设计
说明: 1、自动变量是局部变量 2、在对自动变量赋值之前,它的值是不确定的。 3、对同一个函数的两次调用之间,自动变量的 值是不保留的。
第 四章
模块化程序设计
x=1 x=3 调用prt printf(“2nd x=%d\n”,x); printf(“1st x = %d\n”, x);
• 函数递归调用:一个函数直接或间接调用 它自己。 f1( ) { … f1( ) … } f1( ) { … f2( ) … f2( ) { … f1( ) … }
}
第 四章
递归方式 中止条件
模块化程序设计
long rfact( int n) { Байду номын сангаасf(n<0) { printf(―Negative‖); exit(-1); } else if(n<=1) return(1); else return(n*rfact(n-1)); }
第 四章
模块化程序设计
static unsigned int r; int 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; i<10;i++) printf(―%u‖, random( )); }
函数不能嵌套定义,也就是说,一个函数不 能定义在另外一个函数内部。函数与函数在 定义时是相互独立的。
第 四章
4 . 函数的返回
模块化程序设计
函数执行的最后一个操作是返回。其意义是: (1) 使流程返回主调函数,宣告函数的一次执行 终结,在调用期间所分配的变量单元被撤消。 (2) 送函数值到调用表达式中。有些函数有返回 值,有些可以没有。