《函数C语言大学实用教程课件苏小红.ppt》由会员分享,可在线阅读,更多相关《函数C语言大学实用教程课件苏小红.ppt(88页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第第第5 5 5 5章章章章 函数与程序结构函数与程序结构函数与程序结构函数与程序结构哈尔滨工业大学计算机科学与技术学院哈尔滨工业大学计算机科学与技术学院苏小红苏小红C语言大学实用教程语言大学实用教程2023/4/132内容提要内容提要 函数定义、函数调用、函数原型、函数返回值函数定义、函数调用、函数原型、函数返回值函数定义、函数调用、函数原型、函数返回值函数定义、函数调用、函数原型、函数返回值难点:函数的参数传递与返回值难点:函数的参数传递与返回值难点:函数的参数传递与返回值难点:函数的参数传递与返回值 全局变量、自动变量、静态变量、寄存器变量全局变量、自动变量、静态变量、寄存器变量全局变
2、量、自动变量、静态变量、寄存器变量全局变量、自动变量、静态变量、寄存器变量难点:变量的作用域与存储类型难点:变量的作用域与存储类型难点:变量的作用域与存储类型难点:变量的作用域与存储类型 程序调试程序调试程序调试程序调试 结构设计与模块化结构设计与模块化结构设计与模块化结构设计与模块化 代码风格问题代码风格问题代码风格问题代码风格问题MoeCurlyLarry2023/4/133程序设计的艺术程序设计的艺术 三国演义三国演义三国演义三国演义中有这样一段描写:中有这样一段描写:中有这样一段描写:中有这样一段描写:懿问曰:懿问曰:懿问曰:懿问曰:“孔明寝食及事之烦简若何?孔明寝食及事之烦简若何?孔
3、明寝食及事之烦简若何?孔明寝食及事之烦简若何?”使者曰:使者曰:使者曰:使者曰:“丞相夙兴夜寐,罚二十以上皆亲览焉。所啖之食,丞相夙兴夜寐,罚二十以上皆亲览焉。所啖之食,丞相夙兴夜寐,罚二十以上皆亲览焉。所啖之食,丞相夙兴夜寐,罚二十以上皆亲览焉。所啖之食,日不过数升。日不过数升。日不过数升。日不过数升。”懿顾谓诸将曰:懿顾谓诸将曰:懿顾谓诸将曰:懿顾谓诸将曰:“孔明食少事烦,孔明食少事烦,孔明食少事烦,孔明食少事烦,其能久乎?其能久乎?其能久乎?其能久乎?”此话音落不久,诸葛亮果然病故于五丈原。此话音落不久,诸葛亮果然病故于五丈原。此话音落不久,诸葛亮果然病故于五丈原。此话音落不久,诸葛亮果
4、然病故于五丈原。“事无巨细事无巨细事无巨细事无巨细”,“事必躬亲事必躬亲事必躬亲事必躬亲”管理学的观点是极其排斥这种做法的,认为工作必管理学的观点是极其排斥这种做法的,认为工作必管理学的观点是极其排斥这种做法的,认为工作必管理学的观点是极其排斥这种做法的,认为工作必须分工,各司其职须分工,各司其职须分工,各司其职须分工,各司其职其中的思想,在程序设计里也适用其中的思想,在程序设计里也适用其中的思想,在程序设计里也适用其中的思想,在程序设计里也适用 2023/4/134程序设计的艺术程序设计的艺术 C C语言为程序的结构提供了两样武器语言为程序的结构提供了两样武器语言为程序的结构提供了两样武器语
5、言为程序的结构提供了两样武器函数和模块函数和模块函数和模块函数和模块 函数函数函数函数(functionfunction)是结构设计的最基本单位)是结构设计的最基本单位)是结构设计的最基本单位)是结构设计的最基本单位“一个程序应该是轻灵自由的,它的一个程序应该是轻灵自由的,它的一个程序应该是轻灵自由的,它的一个程序应该是轻灵自由的,它的子过程子过程子过程子过程就象串就象串就象串就象串在一根线上的珍珠。在一根线上的珍珠。在一根线上的珍珠。在一根线上的珍珠。”Geoffrey JamesGeoffrey James的的的的编程之道编程之道编程之道编程之道 2023/4/135数学函数数学函数(1)
6、(1)自变量自变量因变量因变量函数名函数名2023/4/136数学函数数学函数(2)(2)一个自变量,一个因变量一个自变量,一个因变量两个两个自变量,一个因变量自变量,一个因变量2023/4/137数学函数数学函数(3)(3)自变量自变量因变量因变量2023/4/138数学函数数学函数(4)(4)一个变量一个变量二个变量二个变量N个变量个变量一个变量一个变量二个变量二个变量N个变量个变量自变量自变量与与因变量因变量的关系的关系2023/4/139数学函数数学函数(5)(5)集合A关系集合B2023/4/1310程序设计中的函数程序设计中的函数 程序设计中的函数不局限于计算程序设计中的函数不局限
7、于计算程序设计中的函数不局限于计算程序设计中的函数不局限于计算计算类,如打印阶乘表的程序计算类,如打印阶乘表的程序计算类,如打印阶乘表的程序计算类,如打印阶乘表的程序判断推理类,如排序、查找判断推理类,如排序、查找判断推理类,如排序、查找判断推理类,如排序、查找2023/4/1311用函数解决问题的要点用函数解决问题的要点 分而治之分而治之分而治之分而治之函数把较大的任务分解成若干个较小的任务,并提炼出函数把较大的任务分解成若干个较小的任务,并提炼出函数把较大的任务分解成若干个较小的任务,并提炼出函数把较大的任务分解成若干个较小的任务,并提炼出公用任务公用任务公用任务公用任务 复用复用复用复用
8、程序员可以在其他函数的基础上构造程序,而不需要从程序员可以在其他函数的基础上构造程序,而不需要从程序员可以在其他函数的基础上构造程序,而不需要从程序员可以在其他函数的基础上构造程序,而不需要从头做起头做起头做起头做起 信息隐藏信息隐藏信息隐藏信息隐藏设计得当的函数可以把具体操作细节对程序中不需要知设计得当的函数可以把具体操作细节对程序中不需要知设计得当的函数可以把具体操作细节对程序中不需要知设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚道它们的那些部分隐藏掉,从而使整个程序结构清楚道它们的那些部分隐藏掉,从而使整个程序结构清楚道它们的那些部分隐藏
9、掉,从而使整个程序结构清楚MoeCurlyLarry2023/4/1312C中的函数中的函数(Function)说明说明说明说明:L一个源程序文件由一个或多个函数组成。一个源程序文件由一个或多个函数组成。一个源程序文件由一个或多个函数组成。一个源程序文件由一个或多个函数组成。L一个一个一个一个C C程序由一个或多个源程序文件组成。程序由一个或多个源程序文件组成。程序由一个或多个源程序文件组成。程序由一个或多个源程序文件组成。LC C程序的执行从程序的执行从程序的执行从程序的执行从mainmain函数开始,调用其他函数后流程函数开始,调用其他函数后流程函数开始,调用其他函数后流程函数开始,调用其
10、他函数后流程回到回到回到回到mainmain函数,在函数,在函数,在函数,在mainmain函数中结束整个程序运行。函数中结束整个程序运行。函数中结束整个程序运行。函数中结束整个程序运行。L所有函数都是平行的,即函数定义时是互相独立的,所有函数都是平行的,即函数定义时是互相独立的,所有函数都是平行的,即函数定义时是互相独立的,所有函数都是平行的,即函数定义时是互相独立的,一个函数并不从属于另一个函数。一个函数并不从属于另一个函数。一个函数并不从属于另一个函数。一个函数并不从属于另一个函数。2023/4/1313函数的分类函数的分类 标准函数,即库函数标准函数,即库函数标准函数,即库函数标准函数
11、,即库函数 目前为止,我们所学习的目前为止,我们所学习的目前为止,我们所学习的目前为止,我们所学习的printf()printf()、scanf()scanf()等都等都等都等都是是是是ANSI CANSI C标准定义的库函数。任意符合标准定义的库函数。任意符合标准定义的库函数。任意符合标准定义的库函数。任意符合ANSI ANSI C C的编译器,不管它支持什么平台,都必须提的编译器,不管它支持什么平台,都必须提的编译器,不管它支持什么平台,都必须提的编译器,不管它支持什么平台,都必须提供这些函数供用户使用。供这些函数供用户使用。供这些函数供用户使用。供这些函数供用户使用。用户自定义函数用户自
12、定义函数用户自定义函数用户自定义函数 用户按自己的意愿编写自己的函数,完成人员用户按自己的意愿编写自己的函数,完成人员用户按自己的意愿编写自己的函数,完成人员用户按自己的意愿编写自己的函数,完成人员功能。功能。功能。功能。2023/4/1314函数的定义函数的定义 变量必须先定义,后使用。函数也一样。变量必须先定义,后使用。函数也一样。变量必须先定义,后使用。函数也一样。变量必须先定义,后使用。函数也一样。函数定义的语法如下:函数定义的语法如下:函数定义的语法如下:函数定义的语法如下:返回值类型返回值类型返回值类型返回值类型 函数名函数名函数名函数名(类型类型类型类型 参数参数参数参数1,1,
13、类型类型类型类型 参数参数参数参数2,2,)函数体函数体函数体函数体returnreturn 表达式表达式表达式表达式;返回值类型与返回值类型与返回值类型与返回值类型与returnreturn语句配合语句配合语句配合语句配合 当函数执行到当函数执行到当函数执行到当函数执行到returnreturn语句时,就中止函数的执行,语句时,就中止函数的执行,语句时,就中止函数的执行,语句时,就中止函数的执行,返回到返回到返回到返回到调用它的地方调用它的地方调用它的地方调用它的地方函数名的命名规则和变量名的命名规则一致。函数名的命名规则和变量名的命名规则一致。函数名的命名规则和变量名的命名规则一致。函数名
14、的命名规则和变量名的命名规则一致。函数的返回值是通过函数的返回值是通过函数中的函数中的 return 语语句获得的。句获得的。2023/4/1315函数定义(函数定义(definition)如果如果如果如果没有参数没有参数没有参数没有参数,则应该用,则应该用,则应该用,则应该用voidvoid注明注明注明注明其形如:其形如:其形如:其形如:如果如果如果如果不需要返回值不需要返回值不需要返回值不需要返回值,则应该用,则应该用,则应该用,则应该用voidvoid定义返回值类型定义返回值类型定义返回值类型定义返回值类型其形如:其形如:其形如:其形如:函数内部可以定义只能由该函数自己使用的变量,称函数
15、内部可以定义只能由该函数自己使用的变量,称函数内部可以定义只能由该函数自己使用的变量,称函数内部可以定义只能由该函数自己使用的变量,称内部变内部变内部变内部变量量量量。参数表里的变量也是内部变量参数表里的变量也是内部变量参数表里的变量也是内部变量参数表里的变量也是内部变量int Func(void)void Func(int i,float f)2023/4/1316函数参数函数参数 函数参数函数参数:形参形参形参形参(形式参数形式参数形式参数形式参数 ):):在定义函数时,定义函数名后面括号中的变量名在定义函数时,定义函数名后面括号中的变量名在定义函数时,定义函数名后面括号中的变量名在定义函
16、数时,定义函数名后面括号中的变量名实参实参实参实参(实际参数实际参数实际参数实际参数 ):):在主调函数中调用一个函数,调用函数名后面括号在主调函数中调用一个函数,调用函数名后面括号在主调函数中调用一个函数,调用函数名后面括号在主调函数中调用一个函数,调用函数名后面括号中的参数中的参数中的参数中的参数(或表达式或表达式或表达式或表达式)int Average(int x,int y)int result;result=(x+y)/2;return result;main()int a=12;int b=24;int ave;ave=Average(a,b);printf();数据传递执行顺序实
17、参实参实参实参形参形参形参形参2023/4/1317函数调用(函数调用(call)从实参到形参是从实参到形参是从实参到形参是从实参到形参是单向值传递单向值传递单向值传递单向值传递 调用时会把实参的值分别调用时会把实参的值分别调用时会把实参的值分别调用时会把实参的值分别复制复制复制复制给形参,这个过程给形参,这个过程给形参,这个过程给形参,这个过程就是值传递。就是值传递。就是值传递。就是值传递。调用函数时,调用函数时,调用函数时,调用函数时,必须提供所有的参数必须提供所有的参数必须提供所有的参数必须提供所有的参数(且必须是已(且必须是已(且必须是已(且必须是已赋值的)赋值的)赋值的)赋值的)提供
18、的参数个数、类型、顺序应与定义时相同提供的参数个数、类型、顺序应与定义时相同提供的参数个数、类型、顺序应与定义时相同提供的参数个数、类型、顺序应与定义时相同形式参数形式参数形式参数形式参数实际参数实际参数实际参数实际参数2023/4/1318例例5.1a 计算两个整数的平均数计算两个整数的平均数/*/*函数功能:函数功能:函数功能:函数功能:计算平均数计算平均数计算平均数计算平均数 函数入口参数:函数入口参数:函数入口参数:函数入口参数:整型整型整型整型x x,存储第一个运算数,存储第一个运算数,存储第一个运算数,存储第一个运算数 整型整型整型整型y y,存储第二个运算数,存储第二个运算数,存
19、储第二个运算数,存储第二个运算数 函数返回值:函数返回值:函数返回值:函数返回值:平均数平均数平均数平均数*/intint Average(Average(intint x,x,intint y)y)intint result;result;result=(x+y)/2;result=(x+y)/2;returnreturn result;result;2023/4/1319例例5.1b 使用了使用了Average函数的函数的main()mainmain()()intint a=12;a=12;intint b=24;b=24;intint ave;ave;ave=Average(a,b);a
20、ve=Average(a,b);printfprintf(Average of%d and%d is%d.nAverage of%d and%d is%d.n,a,b,ave);a,b,ave);int Average(int x,int y)int result;result=(x+y)/2;return result;main()int a=12;int b=24;int ave;ave=Average(a,b);printf();数据传递执行顺序2023/4/1320函数调用(函数调用(call)有返回值时有返回值时有返回值时有返回值时函数调用可以放到一个数值表达式中函数调用可以放到一个
21、数值表达式中函数调用可以放到一个数值表达式中函数调用可以放到一个数值表达式中 如如如如 c=max(a,b);c=max(a,b);也可作为另一个函数调用的参数也可作为另一个函数调用的参数也可作为另一个函数调用的参数也可作为另一个函数调用的参数 如如如如 c=max(max(a,b),c);c=max(max(a,b),c);printf(printf(%dn%dn,max(a,b);,max(a,b);无返回值时无返回值时无返回值时无返回值时函数调用可直接作为表达式函数调用可直接作为表达式函数调用可直接作为表达式函数调用可直接作为表达式 如如如如 display(a,b);display(a
22、,b);返回值返回值返回值返回值 =函数名函数名函数名函数名(实参表列实参表列实参表列实参表列););函数名函数名函数名函数名(实参表列实参表列实参表列实参表列););2023/4/1321函数原型(函数原型(prototype)调用一个函数之前,先要对其调用一个函数之前,先要对其调用一个函数之前,先要对其调用一个函数之前,先要对其返回值类型返回值类型返回值类型返回值类型、函数名函数名函数名函数名和和和和参数参数参数参数进行声明(进行声明(进行声明(进行声明(declaredeclare)有助于编译器进行类型检查有助于编译器进行类型检查有助于编译器进行类型检查有助于编译器进行类型检查 声明时不
23、要省略参数以及返回值的类型声明时不要省略参数以及返回值的类型声明时不要省略参数以及返回值的类型声明时不要省略参数以及返回值的类型2023/4/1322例例5.1#includeinclude /*/*函数功能:函数功能:函数功能:函数功能:计算平均数计算平均数计算平均数计算平均数 函数入口参数:函数入口参数:函数入口参数:函数入口参数:整型整型整型整型x x,存储第一个运算数,存储第一个运算数,存储第一个运算数,存储第一个运算数 整型整型整型整型y y,存储第二个运算数,存储第二个运算数,存储第二个运算数,存储第二个运算数 函数返回值:函数返回值:函数返回值:函数返回值:平均数平均数平均数平均
24、数*/mainmain()()intint a=12;a=12;intint b=24;b=24;intint ave=ave=Average(a,b)Average(a,b);printfprintf(Average of%d and%d is%d.n,a,b,ave);(Average of%d and%d is%d.n,a,b,ave);当返回值为整型或者函数定义在函当返回值为整型或者函数定义在函数调用前面时,可以省略原型数调用前面时,可以省略原型intint Average(Average(intint x,x,intint y)y)intint result;result;resul
25、t=(x+y)/2;result=(x+y)/2;returnreturn result;result;2023/4/1323例例5.1#includeinclude /*/*声明声明声明声明Average()Average()函数函数函数函数*/mainmain()()intint a=12;a=12;intint b=24;b=24;intint ave=Average(a,b);ave=Average(a,b);printfprintf(Average of%d and%d is%d.n,a,b,ave);(Average of%d and%d is%d.n,a,b,ave);/*/*函
26、数功能:函数功能:函数功能:函数功能:计算平均数计算平均数计算平均数计算平均数 函数入口参数:函数入口参数:函数入口参数:函数入口参数:整型整型整型整型x x,存储第一个运算数,存储第一个运算数,存储第一个运算数,存储第一个运算数 整型整型整型整型y y,存储第二个运算数,存储第二个运算数,存储第二个运算数,存储第二个运算数 函数返回值:函数返回值:函数返回值:函数返回值:平均数平均数平均数平均数*/intint Average(Average(intint x,x,intint y)y)intint result;result;result=(x+y)/2;result=(x+y)/2;re
27、turnreturn result;result;int Average(int x,int y);2023/4/1324main()a();a 函数函数b();return;b函数函数return;在被调函数中,又调用了函数在被调函数中,又调用了函数-嵌套调用嵌套调用函数的嵌套调用函数的嵌套调用函数的嵌套调用函数的嵌套调用2023/4/1325循序渐进式编程循序渐进式编程实验实验4:小学生加法考试题:小学生加法考试题 通过输入两个加通过输入两个加数给学生出一道数给学生出一道加法运算题加法运算题输入答案正确输入答案正确:right错误错误:Not correct!Try again!2023/
28、4/1326只答1次直到做对为止最多给3次机会随机出题连续做10道题统计分数循序渐进式编程循序渐进式编程实验实验4:小学生加法考试题:小学生加法考试题 2023/4/1327void Print(int flag)void Print(int flag)if(flag)if(flag)printf(Right!n);printf(Right!n);else else printf(Not correct!n);printf(Not correct!n);实验实验4:小学生加法考试题:小学生加法考试题/*/*函数功能:函数功能:函数功能:函数功能:计算两整型数之和,如果与用户输入的答案相同,则返
29、回计算两整型数之和,如果与用户输入的答案相同,则返回计算两整型数之和,如果与用户输入的答案相同,则返回计算两整型数之和,如果与用户输入的答案相同,则返回1 1,否则返回,否则返回,否则返回,否则返回0 0 函数参数:函数参数:函数参数:函数参数:整型变量整型变量整型变量整型变量a a和和和和b b,分别代表被加数和加数,分别代表被加数和加数,分别代表被加数和加数,分别代表被加数和加数 函数返回值:当函数返回值:当函数返回值:当函数返回值:当a a加加加加b b的结果与用户输入的答案相同时,返回的结果与用户输入的答案相同时,返回的结果与用户输入的答案相同时,返回的结果与用户输入的答案相同时,返回
30、1 1,否则返回,否则返回,否则返回,否则返回0 0*/*/intint AddTest(AddTest(intint a,a,intint b)b)intint answer;answer;printf(%d+%d=,a,b);printf(%d+%d=,a,b);scanf(%d,&answer);scanf(%d,&answer);ifif(a+b=answer)(a+b=answer)returnreturn 1;1;elseelse returnreturn 0;0;只答1次2023/4/1328main()int a,b,answer;printf(Input a,b:);scan
31、f(%d,%d,&a,&b);answer=AddTest(a,b);Print(answer);do while(answer=0);实验实验4:小学生加法考试题:小学生加法考试题 直到做对为止2023/4/1329main()answer=AddTest(a,b);Print(answer,chance);chance=0;do chance+;while(answer=0&chance 3);实验实验4:小学生加法考试题:小学生加法考试题 最多给3次机会2023/4/1330 srand(time(NULL);error=0;score=0;for(i=0;i10;i+)a=rand()
32、%10+1;b=rand()%10+1;answer=AddTest(a,b);Print(answer);if(answer=1)score=score+10;else error+;实验实验4:小学生加法考试题:小学生加法考试题 随机出题连续做10道题统计分数2023/4/1331作业作业 P180P180,习题,习题,习题,习题5.35.45.35.42023/4/1332函数与类型函数与类型C C语言规定:语言规定:语言规定:语言规定:返回表达式的类型必须能转换到函数定义头部的返回返回表达式的类型必须能转换到函数定义头部的返回返回表达式的类型必须能转换到函数定义头部的返回返回表达式的类
33、型必须能转换到函数定义头部的返回值类型。执行返回语句时,表达式求出的值先转换到函数值类型。执行返回语句时,表达式求出的值先转换到函数值类型。执行返回语句时,表达式求出的值先转换到函数值类型。执行返回语句时,表达式求出的值先转换到函数头部要求的类型,以转换的结果作为实际返回值。举例来头部要求的类型,以转换的结果作为实际返回值。举例来头部要求的类型,以转换的结果作为实际返回值。举例来头部要求的类型,以转换的结果作为实际返回值。举例来说,在下面的函数定义里,说,在下面的函数定义里,说,在下面的函数定义里,说,在下面的函数定义里,returnreturn语句求出表达式的值之语句求出表达式的值之语句求出
34、表达式的值之语句求出表达式的值之后就需要做类型转换:后就需要做类型转换:后就需要做类型转换:后就需要做类型转换:int fun(int m)int fun(int m)return 3.14159*m;return 3.14159*m;2023/4/1333函数与类型函数与类型 要求每个实参的值应该能转换到函数参数表里规定的要求每个实参的值应该能转换到函数参数表里规定的要求每个实参的值应该能转换到函数参数表里规定的要求每个实参的值应该能转换到函数参数表里规定的类型。如果某个实参的类型与函数的要求不一致,首先转类型。如果某个实参的类型与函数的要求不一致,首先转类型。如果某个实参的类型与函数的要求
35、不一致,首先转类型。如果某个实参的类型与函数的要求不一致,首先转换该实参求出的值,而后将得到的结果送给函数。换该实参求出的值,而后将得到的结果送给函数。换该实参求出的值,而后将得到的结果送给函数。换该实参求出的值,而后将得到的结果送给函数。例如,对上面的函数例如,对上面的函数例如,对上面的函数例如,对上面的函数funfun,下面调用中也要做类型转换:,下面调用中也要做类型转换:,下面调用中也要做类型转换:,下面调用中也要做类型转换:x=fun(3.09);x=fun(3.09);2023/4/1334int f(int n,float m)int f(int n,float m)return(
36、m+n)/4;return(m+n)/4;int main()int main()float y=3;float y=3;printf(%dn,f(y,y+1);printf(%dn,f(y,y+1);return 0;return 0;下面的程序在执行时,哪些地方将发生类型转换?程序打印的值是什么?下面的程序在执行时,哪些地方将发生类型转换?程序打印的值是什么?下面的程序在执行时,哪些地方将发生类型转换?程序打印的值是什么?下面的程序在执行时,哪些地方将发生类型转换?程序打印的值是什么?2023/4/1335命名规则命名规则 在在在在Linux/UnixLinux/Unix平台平台平台平台习
37、惯用习惯用习惯用习惯用function_namefunction_name 本书采用本书采用本书采用本书采用WindowsWindows风格函数名命名风格函数名命名风格函数名命名风格函数名命名用大写字母开头、大小写混排的单词组合而成用大写字母开头、大小写混排的单词组合而成用大写字母开头、大小写混排的单词组合而成用大写字母开头、大小写混排的单词组合而成 FunctionNameFunctionName 变量名形式变量名形式变量名形式变量名形式“名词名词名词名词”或者或者或者或者“形容词形容词形容词形容词+名词名词名词名词”如变量名如变量名如变量名如变量名oldValueoldValue与与与与n
38、ewValuenewValue等等等等 函数名形式函数名形式函数名形式函数名形式“动词动词动词动词”或者或者或者或者“动词动词动词动词+名词名词名词名词”(动宾词组)(动宾词组)(动宾词组)(动宾词组)如函数名如函数名如函数名如函数名GetMax()GetMax()等等等等 2023/4/1336对函数接口加以注释说明对函数接口加以注释说明/*/*函数功能:实现函数功能:实现函数功能:实现函数功能:实现功能功能功能功能 函数参数:参数函数参数:参数函数参数:参数函数参数:参数1 1,表示,表示,表示,表示 参数参数参数参数2 2,表示,表示,表示,表示 函数返回值:函数返回值:函数返回值:函数
39、返回值:*/返回值类型返回值类型返回值类型返回值类型 函数名函数名函数名函数名(参数表参数表参数表参数表)函数体函数体函数体函数体returnreturn 表达式表达式表达式表达式;2023/4/1337主函数主函数mainmain的的返返回回值值规规定定为为int。这这个个返返回回值值在在程程序序结结束束时时送给外部。程序外部(如操作系统)可用这个值送给外部。程序外部(如操作系统)可用这个值一般用一般用返回返回0表示程序正常结束,其他值表示出错表示程序正常结束,其他值表示出错main以外的以外的函数只有被调用时才会执行函数只有被调用时才会执行不允许调用不允许调用mainint main()/
40、*一般写法一般写法*/.return 0;2023/4/1338变量的作用域变量的作用域 指在源程序中定义变量的位置及其能被读写访问的指在源程序中定义变量的位置及其能被读写访问的指在源程序中定义变量的位置及其能被读写访问的指在源程序中定义变量的位置及其能被读写访问的范围范围范围范围 分为分为分为分为局部变量(局部变量(局部变量(局部变量(Local VariableLocal Variable)全局变量全局变量全局变量全局变量(Global Variable)(Global Variable)演示变量的作用域规则演示变量的作用域规则演示变量的作用域规则演示变量的作用域规则例例例例5.45.42
41、023/4/1339局部变量局部变量 局部变量局部变量局部变量局部变量在语句块内定义的变量在语句块内定义的变量在语句块内定义的变量在语句块内定义的变量形参也是局部变量形参也是局部变量形参也是局部变量形参也是局部变量 特点特点特点特点定义时不会自动初始化,除非程序员指定初值定义时不会自动初始化,除非程序员指定初值定义时不会自动初始化,除非程序员指定初值定义时不会自动初始化,除非程序员指定初值进入语句块时获得内存,仅能由语句块内语句访问,进入语句块时获得内存,仅能由语句块内语句访问,进入语句块时获得内存,仅能由语句块内语句访问,进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不
42、再有效退出语句块时释放内存,不再有效退出语句块时释放内存,不再有效退出语句块时释放内存,不再有效 并列语句块各自定义的同名变量互不干扰并列语句块各自定义的同名变量互不干扰并列语句块各自定义的同名变量互不干扰并列语句块各自定义的同名变量互不干扰 2023/4/1340全局变量全局变量 全局变量全局变量全局变量全局变量在所有函数之外定义的变量在所有函数之外定义的变量在所有函数之外定义的变量在所有函数之外定义的变量 特点特点特点特点在程序中定义它的位置以后都有效在程序中定义它的位置以后都有效在程序中定义它的位置以后都有效在程序中定义它的位置以后都有效在定义点之前或在其他文件中引用,应该进行如下声明:
43、在定义点之前或在其他文件中引用,应该进行如下声明:在定义点之前或在其他文件中引用,应该进行如下声明:在定义点之前或在其他文件中引用,应该进行如下声明:extern extern 类型名类型名类型名类型名 变量名变量名变量名变量名;从程序运行起即占据内存,程序运行过程中可随时访问,从程序运行起即占据内存,程序运行过程中可随时访问,从程序运行起即占据内存,程序运行过程中可随时访问,从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存程序退出时释放内存程序退出时释放内存程序退出时释放内存 使函数之间的数据交换更容易,也更高效使函数之间的数据交换更容易,也更高效使函数之间的数据交换更容
44、易,也更高效使函数之间的数据交换更容易,也更高效 但是并不推荐使用,尽量少用但是并不推荐使用,尽量少用但是并不推荐使用,尽量少用但是并不推荐使用,尽量少用 因为谁都可以改写全局变量,所以很难确定是谁改写了它因为谁都可以改写全局变量,所以很难确定是谁改写了它因为谁都可以改写全局变量,所以很难确定是谁改写了它因为谁都可以改写全局变量,所以很难确定是谁改写了它2023/4/1341例例5.7#includeinclude int global;int global;/*/*定义全局变量定义全局变量定义全局变量定义全局变量*/voidvoid GlobalPlusPlus(GlobalPlusPlus
45、(voidvoid););main()main()global=1;global=1;printfprintf(Before GlobalPlusPlus(),it is%dn,global);(Before GlobalPlusPlus(),it is%dn,global);GlobalPlusPlus();GlobalPlusPlus();printfprintf(After GlobalPlusPlus(),it is%dn,global);(After GlobalPlusPlus(),it is%dn,global);/*/*函数功能:函数功能:函数功能:函数功能:对对对对全局变量全
46、局变量全局变量全局变量globalglobal加加加加1 1,并打印加,并打印加,并打印加,并打印加1 1之前与之后的值之前与之后的值之前与之后的值之前与之后的值 函数入口参数:函数入口参数:函数入口参数:函数入口参数:无无无无 函数返回值:函数返回值:函数返回值:函数返回值:无无无无*/voidvoid GlobalPlusPlus(GlobalPlusPlus(voidvoid)printfprintf(Before+,it is%dn,global);(Before+,it is%dn,global);global+;global+;printfprintf(After+,it is%d
47、n,global);(After+,it is%dn,global);Before GlobalPlusPlus(),it is 1Before GlobalPlusPlus(),it is 1Before+,it is 1Before+,it is 1After+,it is 2After+,it is 2After GlobalPlusPlus(),it is 2After GlobalPlusPlus(),it is 2全局变量在程序员不指定初值的情况下全局变量在程序员不指定初值的情况下全局变量在程序员不指定初值的情况下全局变量在程序员不指定初值的情况下自动初始化为零,在此初始化为自动初
48、始化为零,在此初始化为自动初始化为零,在此初始化为自动初始化为零,在此初始化为0 02023/4/1342例例5.8#includeinclude voidvoid GlobalPlusPlus(GlobalPlusPlus(voidvoid););main()main()int global=1;int global=1;printfprintf(Before GlobalPlusPlus(),it is%dn,global);(Before GlobalPlusPlus(),it is%dn,global);GlobalPlusPlus();GlobalPlusPlus();printfp
49、rintf(After GlobalPlusPlus(),it is%dn,global);(After GlobalPlusPlus(),it is%dn,global);/*/*函数功能:函数功能:函数功能:函数功能:对对对对局部变量局部变量局部变量局部变量globalglobal加加加加1 1,并打印加,并打印加,并打印加,并打印加1 1之前与之后的值之前与之后的值之前与之后的值之前与之后的值 函数入口参数:函数入口参数:函数入口参数:函数入口参数:无无无无 函数返回值:函数返回值:函数返回值:函数返回值:无无无无*/voidvoid GlobalPlusPlus(GlobalPlusP
50、lus(voidvoid)int global=1;int global=1;printfprintf(Before+,it is%dn,global);(Before+,it is%dn,global);global+;global+;printfprintf(After+,it is%dn,global);(After+,it is%dn,global);Before GlobalPlusPlus(),it is 1Before GlobalPlusPlus(),it is 1Before+,it is 1Before+,it is 1After+,it is 2After+,it is