1、12005年1月22005年1月3C程序程序源程序文件源程序文件n函数函数1函数函数m 源程序文件源程序文件1函数函数1函数函数n2005年1月4程序的执行总是程序的执行总是从从main函数开始函数开始2005年1月52005年1月6 一个一个C源程序可以由一个或多个源程序文件组源程序可以由一个或多个源程序文件组成。成。C编译系统在对编译系统在对C源程序进行编译时是以文件源程序进行编译时是以文件为单位进行的。为单位进行的。一个一个C源程序文件可以由一个或多个函数组成。源程序文件可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数,所有函数都是独立的。主函数可以调用其它函数,其它
2、函数可以相互调用。其它函数可以相互调用。在一个在一个C程序中,有且仅有一个主函数程序中,有且仅有一个主函数main。C程序的执行总是从程序的执行总是从main函数开始,调用其它函数函数开始,调用其它函数后最终回到后最终回到main函数,在函数,在main函数中结束整个程函数中结束整个程序的运行。序的运行。2005年1月72022-11-2782022-11-2792005年1月10函数定义的一般形式函数定义的一般形式函数类型函数类型 函数名函数名(类型名类型名 形式参数形式参数1,)说明语句说明语句 执行语句执行语句 例如:求两个数的最大值。例如:求两个数的最大值。int max(int x,
3、int y)int z;z=x y?x:y;return(z);2022-11-2711/*函数定义函数定义*/int(int y)/*函数首部函数首部*/return y*y*y;例例4-1 编写一个函数编写一个函数cube,计算整数的立方。,计算整数的立方。2005年1月12函数名(实参表列)函数名(实参表列)在在C语言中,把函数调用也作为一个表达式。因语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。此凡是表达式可以出现的地方都可以出现函数调用。例如:例如:welcome();/*函数调用语句函数调用语句*/if(iabs(a)max)max=iabs(
4、a);/*函数调用构成表达式函数调用构成表达式*/m=max(c,max(a,b);/*函数调用作为函数参函数调用作为函数参数数*/4.2.2 函数的调用函数的调用函数调用的一般形式:函数调用的一般形式:2005年1月13void swap(int x,int y)int z;z=x;x=y;y=z;printf(nx=%d,y=%d,x,y);main()int a=10,b=20;swap(a,b);printf(na=%d,b=%dn,a,b);1函数的参数传递(值传递)函数的参数传递(值传递)程序输出结果:程序输出结果:x=20,y=10a=10,b=20形式参数(形参)形式参数(形参
5、)实际参数(实参)实际参数(实参)【例例】编一程序,将主函数中的两个变量的值传递给编一程序,将主函数中的两个变量的值传递给swap函函数中的两个形参,交换两个形参的值。数中的两个形参,交换两个形参的值。单向值传递单向值传递2022-11-2714 当函数被调用时才给形参分配内存单元。调用结当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。束,所占内存被释放。实参可以是常量、变量或表达式,但要求它们有实参可以是常量、变量或表达式,但要求它们有确定的值。确定的值。实参与形参类型要一致,字符型与整型兼容。实参与形参类型要一致,字符型与整型兼容。实参与形参的个数必须相等。在函数调用时,实实
6、参与形参的个数必须相等。在函数调用时,实参的值赋给与之相对应的形参。参的值赋给与之相对应的形参。“单向值传递单向值传递”。2005年1月152.函数的返回值函数的返回值2005年1月16程序运行情况如下:程序运行情况如下:2 12说明:说明:函数的类型决定了函数返回值的类型。若省略函数的类函数的类型决定了函数返回值的类型。若省略函数的类型,系统默认其为型,系统默认其为int型。型。无返回值的函数应将其类型定义为无返回值的函数应将其类型定义为void(空)类型。(空)类型。2022-11-2717定义定义2组,共组,共8个整型变量个整型变量a1a4,b1b4,要求:输入字符,要求:输入字符a和整
7、数和整数1,显,显示示a1变量的值,输入字符变量的值,输入字符b和整数和整数1,显示,显示b1变量的值变量的值2022-11-27182005年1月192005年1月20程序输出结果:程序输出结果:9 2005年1月214.2.5 对被调函数的声明和函数原型对被调函数的声明和函数原型void swap(int x,int y)main()swap(a,b);2005年1月22第二种形式省略了参数名,此种形式也称为第二种形式省略了参数名,此种形式也称为函数的原型函数的原型。如果非整型函数在主调函数之后定义,如果非整型函数在主调函数之后定义,则应在主调函数中或主调函数之前对被则应在主调函数中或主调
8、函数之前对被调函数进行声明。调函数进行声明。2005年1月23#include void main()float calc(float x,float y,char opr);float a,b;char opr;printf(n输入四则运算表达式输入四则运算表达式:);scanf(%f%c%f,&a,&opr,&b);if(opr=+|opr=-|opr=*|opr=/)printf(%5.2f%c%5.2f=%6.2fn,a,opr,b,calc(a,b,opr);else printf(非法运算符非法运算符!n);float calc(float x,float y,char opr)s
9、witch(opr)case+:return(x+y);case -:return(x-y);case *:return(x*y);case /:return(x/y);对被调函对被调函数的声明数的声明2005年1月24:变量在程序中可以被使用的范围。:变量在程序中可以被使用的范围。根据变量的作用域可以将变量分为根据变量的作用域可以将变量分为局部变量和全局局部变量和全局变量变量。():在函数内或复合语句:在函数内或复合语句内内定定义的变量以及义的变量以及。:函数内或复合语句内函数内或复合语句内。4.3.1 局部作用域和局部变量局部作用域和局部变量【例例】分析下面程序的运行结果及变量的作用域。分
10、析下面程序的运行结果及变量的作用域。2005年1月25void main()int a=1,b=1,c=1;printf(main:ta=%d b=%d c=%dn,a,b,c);sub(a,b);printf(main:ta=%d b=%d c=%dn,a,b,c);int a=2,b=2;printf(comp:ta=%d b=%d c=%dn,a,b,c);printf(main:ta=%d b=%d c=%dn,a,b,c);“分程序分程序”或或“程序程序块块”程序输出结果:程序输出结果:main:a=1 b=1 c=1sub:a=2 b=3 c=1main:a=1 b=1 c=1co
11、mp:a=2 b=2 c=1main:a=1 b=1 c=12005年1月26():在):在函数外部函数外部定义的变量。定义的变量。:。【例例】全局变量和局部变量的作用域。全局变量和局部变量的作用域。2005年1月27main()int b=6,c=7;f(b,c);printf(%dt%dt%dn,a,b,c);int a=9,b=8;printf(%dt%dt%dn,a,b,c);printf(%dt%dt%dn,a,b,c);printf(%dt%dt%dn,a,b,c);程序输出结果:程序输出结果:5 11 -25 6 79 8 79 8 109 8 105 6 10全局变量全局变量“
12、分程序分程序”或或“程序程序块块”int2005年1月284.4.1 变量的生存期变量的生存期变量的生存期变量的生存期:变量在内存中占据存储空间的时间。:变量在内存中占据存储空间的时间。程序代码区静态存储区动态存储区存储分配存储分配动态存储变量动态存储变量静态存储变量静态存储变量2005年1月29变量的属性2005年1月30 2005年1月311自动变量(自动变量(auto类别)类别)main()int x,y;main()auto int x,y;等价等价可省局部变量可以定义为自动变量。局部变量可以定义为自动变量。2005年1月32main()int a,b,c;printf(“Enter
13、a,b:n”);scanf(“%d%d”,&a,&b);c=sum(a,b);printf(“Sum=%dn”,c);sum(int a,int b)int c=0;c=a+b;return(c);printf(“Enter a,b:n”);scanf(“%d%d”,&a,&b);c=sum(a,b);c=a+b;return(c);printf(“Sum=%dn”,c);main()Enter a,b:静态静态存储区存储区am 不定不定bm 不定不定cm 不定不定1 2 as=1bs=2cs=0bm=2am=1sum(int a,int b)Sum=3程序区程序区动态动态存储区存储区观察下列
14、程序运行时变量的存储情况观察下列程序运行时变量的存储情况单击开始运行as=1bs=2cs=3cm=3 2005年1月332005年1月34static int a;main()float x,y;f()static int b=1;全局静态变量全局静态变量不能省2005年1月352005年1月36【例例】静态变量的使用。静态变量的使用。2005年1月37int c;static int a;main()float;char s;f()static int b=1;全局静态变量全局静态变量外部变量外部变量2005年1月38注意:注意:外部变量声明用关键字外部变量声明用关键字externexter
15、n,而外部变量的,而外部变量的定义不能用定义不能用externextern,只能隐式定义。,只能隐式定义。定义外部变量时,系统要给变量分配存储空间,定义外部变量时,系统要给变量分配存储空间,而对外部变量声明时,系统不分配存储空间,而对外部变量声明时,系统不分配存储空间,只是让编译系统知道该变量是一个已经定义过只是让编译系统知道该变量是一个已经定义过的外部变量,与函数声明的作用类似。的外部变量,与函数声明的作用类似。2005年1月39外部变量声明外部变量声明思考思考:在在f1函数中声明函数中声明c1、c2的作用是什么?如何修改的作用是什么?如何修改程序使所有函数都可以使用程序使所有函数都可以使用外部变量而又不需要声明?外部变量而又不需要声明?2005年1月402005年1月412005年1月42 局部变量局部变量 全局变量全局变量 静态存储变量静态存储变量包括:局部静态变量和全局变量包括:局部静态变量和全局变量 动态存储变量动态存储变量包括:自动变量包括:自动变量2005年1月43