《第10章函数PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第10章函数PPT讲稿.ppt(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第10章函数章函数第1页,共44页,编辑于2022年,星期日第第1010章章 函数函数在本章的学习中,要重点掌握以下内容:在本章的学习中,要重点掌握以下内容:模块化编程思想;模块化编程思想;函数的作用;函数的作用;函数的声明;函数的声明;函数的形参列表;函数的形参列表;使用使用const形参;形参;main函数的标准形式;函数的标准形式;如何向如何向main函数传值以及如何取得函数传值以及如何取得main函数的值。函数的值。第2页,共44页,编辑于2022年,星期日10.1 10.1 什么是函数什么是函数函数是程序实现模块化编程的基本单元,一般是完成某一特函数是程序实现模块化编程的基本单元,
2、一般是完成某一特定功能的语句的定功能的语句的集合集合;它可以提高程序的可读性和可维护;它可以提高程序的可读性和可维护性,并可以提高代码重用率。本节先介绍模块化编程的思性,并可以提高代码重用率。本节先介绍模块化编程的思想,再介绍函数的定义和调用,并通过一个简单范例来演想,再介绍函数的定义和调用,并通过一个简单范例来演示函数的使用。示函数的使用。第3页,共44页,编辑于2022年,星期日10.1.1 10.1.1 模块化编程模块化编程所谓模块化编程是指将程序划分为一系列功能相互独立的模所谓模块化编程是指将程序划分为一系列功能相互独立的模块,再以模块为单元进行开发,最后合并到主程序的编程块,再以模块
3、为单元进行开发,最后合并到主程序的编程方法。在方法。在C语言中,会把功能独立且完整的模块封装在函语言中,会把功能独立且完整的模块封装在函数中,由函数提供对外的接口,再在外部函数调用。这种数中,由函数提供对外的接口,再在外部函数调用。这种模块化编程是模块化编程是C语言面向过程编程的基本方法。语言面向过程编程的基本方法。第4页,共44页,编辑于2022年,星期日10.1.2 10.1.2 定义函数定义函数函数的定义由函数声明和函数体两部分组成。函数声明又可函数的定义由函数声明和函数体两部分组成。函数声明又可以分为由函数返回值类型、函数名、参数列表、函数体以以分为由函数返回值类型、函数名、参数列表、
4、函数体以及函数操作符及函数操作符5个部分组成。标准形式如下:个部分组成。标准形式如下:函数返回值类型函数返回值类型 函数名函数名(参数类型参数类型1 参数名参数名1,参数类型参数类型1 参参数名数名2,)/*函数体函数体*/变量定义变量定义;函数操作函数操作;return语句语句;第5页,共44页,编辑于2022年,星期日10.1.2 10.1.2 定义函数定义函数函数声明也可以称为函数原型,定义了函数作为模块化编程函数声明也可以称为函数原型,定义了函数作为模块化编程的基本单元的接口:函数值类型对应模块出口,函数名对的基本单元的接口:函数值类型对应模块出口,函数名对应模块名,参数列表对应了模块
5、入口。函数返回值类型也应模块名,参数列表对应了模块入口。函数返回值类型也称为函数值类型,是由函数带回的值的类型。称为函数值类型,是由函数带回的值的类型。函数名是函数的标志符,其命名规范与其余变量名一致;但函数名是函数的标志符,其命名规范与其余变量名一致;但是函数名应该能很清晰地反应函数操作的内容。是函数名应该能很清晰地反应函数操作的内容。参数列表是函数的传入参数列表,依次将放在函数操作符,参数列表是函数的传入参数列表,依次将放在函数操作符,即小括号中。即小括号中。函数体,也被称为函数块,是一个放在花括号内的复合语句。函数体,也被称为函数块,是一个放在花括号内的复合语句。它包括三个部分:变量定义
6、部分,函数操作部分,它包括三个部分:变量定义部分,函数操作部分,return语句。语句。第6页,共44页,编辑于2022年,星期日10.1.3 10.1.3 调用函数调用函数函数调用表达式由函数名、函数操作符和逗号表达式三部分函数调用表达式由函数名、函数操作符和逗号表达式三部分组成。逗号表达式一般为由逗号隔开的若干个子表达式的组成。逗号表达式一般为由逗号隔开的若干个子表达式的集合。如下所示:集合。如下所示:函数名函数名(参数表达式参数表达式1,参数表达式参数表达式2,)函数名指明被调用的函数的名称。函数名指明被调用的函数的名称。逗号表达式一般为由逗号隔开的若干个子表达式的集合,子逗号表达式一般
7、为由逗号隔开的若干个子表达式的集合,子表达式的个数必须与被调用的函数声明的参数个数相同;表达式的个数必须与被调用的函数声明的参数个数相同;如果函数声明中的参数列表为空,逗号表达式也必须为空。如果函数声明中的参数列表为空,逗号表达式也必须为空。第7页,共44页,编辑于2022年,星期日10.1.3 10.1.3 调用函数调用函数参数表达式与函数申明中的参数按从左到右的顺序一一对应,参数表达式与函数申明中的参数按从左到右的顺序一一对应,每个表达式的值类型必须与函数声明中的相应参数类型一每个表达式的值类型必须与函数声明中的相应参数类型一致;否则调用函数时,编译器会自动进行类型转换。如果致;否则调用函
8、数时,编译器会自动进行类型转换。如果转换失败,那么这个函数调用就是错误的。转换失败,那么这个函数调用就是错误的。函数调用表达式的值由函数定义中的函数调用表达式的值由函数定义中的return语句的表达式值语句的表达式值决定,类型为函数声明中的函数值类型。决定,类型为函数声明中的函数值类型。第8页,共44页,编辑于2022年,星期日10.1.3 10.1.3 调用函数调用函数函数调用以及函数代码的执行过程如下:函数调用以及函数代码的执行过程如下:(1)运行到函数调用表达式,先寻找具有该函数名)运行到函数调用表达式,先寻找具有该函数名的函数的函数定义定义,再将函数声明与函数定义的第一行进行比较,函数
9、,再将函数声明与函数定义的第一行进行比较,函数返回值必须一致,形参个数必须与函数调用语句中的实参返回值必须一致,形参个数必须与函数调用语句中的实参个数相同,同时实参类型必须能自动转换为形参类型。个数相同,同时实参类型必须能自动转换为形参类型。(2)得到函数声明后,准备执行函数代码。编译器保存主)得到函数声明后,准备执行函数代码。编译器保存主调函数的执行状态,以便于函数执行完毕后继续执行主调调函数的执行状态,以便于函数执行完毕后继续执行主调函数代码。函数代码。第9页,共44页,编辑于2022年,星期日10.1.3 10.1.3 调用函数调用函数(3)开始执行函数,将函数调用表达式中的各个实参值传
10、)开始执行函数,将函数调用表达式中的各个实参值传递给函数定义中相应的各个形参,必要的情况下会自动执递给函数定义中相应的各个形参,必要的情况下会自动执行类型转换。这个过程叫行类型转换。这个过程叫“参数传递参数传递”。这时,形参才分配。这时,形参才分配到内存空间。到内存空间。(4)执行函数体代码。如果有)执行函数体代码。如果有return语句,执行到语句,执行到return语语句后,函数结束;如果函数中没有句后,函数结束;如果函数中没有return语句,会依次执语句,会依次执行完函数体所有代码。行完函数体所有代码。(5)函数结束后,编译器恢复在执行函数代码前保存的主)函数结束后,编译器恢复在执行函
11、数代码前保存的主调函数的执行状态,将函数返回值带入到函数调用表达式调函数的执行状态,将函数返回值带入到函数调用表达式所在语句,继续代码。所在语句,继续代码。第10页,共44页,编辑于2022年,星期日10.1.3 10.1.3 调用函数调用函数按照函数调用表达式出现的位置,函数调用方式可分为以下按照函数调用表达式出现的位置,函数调用方式可分为以下三种形式:三种形式:1.单独语句单独语句函数调用表达式可以单独作为语句使用。例如范例函数调用表达式可以单独作为语句使用。例如范例10-1中调中调用用void型函数型函数print_array 和和void型函数型函数transpose_array的语句
12、,如下所示:的语句,如下所示:print_array(array);transpose_array(array,transpose);第11页,共44页,编辑于2022年,星期日10.1.3 10.1.3 调用函数调用函数2.子表达式子表达式函数调用表达式还可以作为语句的一个子表达式使用,如下所函数调用表达式还可以作为语句的一个子表达式使用,如下所示:示:b=square(5);/*要求函数值类型不为要求函数值类型不为void型型*/print_array(array),transpose_array(array,transpose);/*函数值类型可以为函数值类型可以为void型型*/3.函
13、数实参函数实参函数调用表达式还可以作为函数参数,这实际上是第二种情况函数调用表达式还可以作为函数参数,这实际上是第二种情况的特殊方式。实例如下:的特殊方式。实例如下:c=max(a,min(a,b);/*要求要求min函数返回类型不为函数返回类型不为void型型*/d=min(a,min(a,b);/*要求要求min函数返回类型不为函数返回类型不为void型型*/第12页,共44页,编辑于2022年,星期日10.1.4 10.1.4 函数使用举例函数使用举例下面围绕一个范例来讨论函数的使用。该范例将加法、减法下面围绕一个范例来讨论函数的使用。该范例将加法、减法和乘法运算封装在函数中,通过函数调
14、用来实现两个数的和乘法运算封装在函数中,通过函数调用来实现两个数的加法、减法和乘法运算。加法、减法和乘法运算。第13页,共44页,编辑于2022年,星期日10.1.5 10.1.5 范例的改进范例的改进对于范例对于范例10-2中的函数体代码和函数调用代码还可以进行适中的函数体代码和函数调用代码还可以进行适当改进。其中,当改进。其中,sum函数、函数、dif函数和函数和pro函数中定义的变函数中定义的变量量tmp都是临时变量,可以省略。例如,函数都是临时变量,可以省略。例如,函数sum的实现的实现与下面这段相对简单的代码功能完全一样,代码如下:与下面这段相对简单的代码功能完全一样,代码如下:in
15、t sum(const int a,const int b)return a+b;第14页,共44页,编辑于2022年,星期日10.2 10.2 函数声明函数声明如前文所述,一个完整的函数声明包括函数值类型、函数名如前文所述,一个完整的函数声明包括函数值类型、函数名和参数列表三个部分组成。完整的函数声明定义了一个功和参数列表三个部分组成。完整的函数声明定义了一个功能模块的接口。本小节将介绍函数声明的标准形式,将声能模块的接口。本小节将介绍函数声明的标准形式,将声明与定义进行比较,让读者更清楚两者的关系;然后将依明与定义进行比较,让读者更清楚两者的关系;然后将依次讨论函数声明中的函数值和参数列表
16、,最后还讨论了函次讨论函数声明中的函数值和参数列表,最后还讨论了函数怠数怠const形参等问题。形参等问题。第15页,共44页,编辑于2022年,星期日10.2.1 10.2.1 声明的形式声明的形式函数声明可以作为单独语句使用,形式如下:函数声明可以作为单独语句使用,形式如下:函数值类型函数值类型 函数名函数名(参数类型参数类型1 形参形参1,参数类型参数类型2 形参形参2,)例如,范例例如,范例10-3中的四个函数声明分别如下:中的四个函数声明分别如下:void print_data(const int a,const int b)int sum(const int a,const int
17、 b)int dif(const int a,const int b)int pro(const int a,const int b)第16页,共44页,编辑于2022年,星期日10.2.1 10.2.1 声明的形式声明的形式函数也可以视为一个变量,函数声明即变量声明,函数名即变量名。该函数变量函数也可以视为一个变量,函数声明即变量声明,函数名即变量名。该函数变量的类型可以称为函数类型,其形式一般为函数声明中去掉函数名的剩余部分,的类型可以称为函数类型,其形式一般为函数声明中去掉函数名的剩余部分,即:即:函数值类型函数值类型 (参数类型参数类型1 形参形参1,参数类型参数类型2 形参形参2,)
18、;由于函数操作符为后置操作符,必须放在变量名后面,所以声明函数型变量时,由于函数操作符为后置操作符,必须放在变量名后面,所以声明函数型变量时,变量名得放在函数操作符前(与数组类型相似)。所以上面的变量名得放在函数操作符前(与数组类型相似)。所以上面的4个函数类型名个函数类型名分别如下:分别如下:print_data的类型为:的类型为:void (const int a,const int b)sum的类型为:的类型为:int (const int a,const int b)dif的类型为:的类型为:int (const int a,const int b)pro的类型为:的类型为:int (
19、const int a,const int b)第17页,共44页,编辑于2022年,星期日10.2.1 10.2.1 声明的形式声明的形式又例如,范例又例如,范例10-1中的两个函数声明如下:中的两个函数声明如下:void print_array(int arraySIZESIZE)void transpose_array(int arraySIZESIZE,int transposeSIZESIZE)这两行语句可以视为声明了两个函数变量,其中变量这两行语句可以视为声明了两个函数变量,其中变量print_array的类型被声明为:的类型被声明为:void(int arraySIZESIZE)
20、而变量而变量transpose_array的类型被声明为:的类型被声明为:void(int arraySIZESIZE,int transposeSIZESIZE)第18页,共44页,编辑于2022年,星期日10.2.2 10.2.2 声明与定义声明与定义与变量一样,函数的声明和定义也是有严格区别的。函数声与变量一样,函数的声明和定义也是有严格区别的。函数声明确定了一个函数的接口,告诉编译器该函数的函数名、明确定了一个函数的接口,告诉编译器该函数的函数名、函数值类型以及形参列表中形参的个数和顺序;而函数定函数值类型以及形参列表中形参的个数和顺序;而函数定义则确立了一个函数的功能,不仅仅包含了函
21、数声明所有义则确立了一个函数的功能,不仅仅包含了函数声明所有的信息,还包含了形参的名字和函数体。的信息,还包含了形参的名字和函数体。在在C程序中,一个函数变量可以被多次声明(当然,所有声程序中,一个函数变量可以被多次声明(当然,所有声明不能冲突),但是函数定义只能有一个。函数定义不能明不能冲突),但是函数定义只能有一个。函数定义不能放在其他函数内,而函数声明则可以。放在其他函数内,而函数声明则可以。提示:函数定义之外的声明中的形参列表的所有参数类型名提示:函数定义之外的声明中的形参列表的所有参数类型名必须与函数定义中的参数类型一致,但是声明的参数名可必须与函数定义中的参数类型一致,但是声明的参
22、数名可以不一样。实际上,函数定义外的函数声明中的参数名是以不一样。实际上,函数定义外的函数声明中的参数名是没有用处的。没有用处的。第19页,共44页,编辑于2022年,星期日10.3.1 10.3.1 函数值类型函数值类型函数值类型可以是整型、浮点型、字符型,也可以是自定义函数值类型可以是整型、浮点型、字符型,也可以是自定义类型(类型(typedef的结果)。下面是几个函数声明的实例:的结果)。下面是几个函数声明的实例:01int get_value(void);02double max(double num1,double num2);03char upletter(char c);第20页
23、,共44页,编辑于2022年,星期日10.3.1 10.3.1 函数值类型函数值类型例如,需要返回一个例如,需要返回一个char型数组的函数,其声明形式如下:型数组的函数,其声明形式如下:char*function(形参列表形参列表);其中,其中,char*是一个是一个char型指针类型。型指针类型。第21页,共44页,编辑于2022年,星期日10.3.2 10.3.2 形参列表形参列表1.形参列表的两种形式形参列表的两种形式作为函数定义一部分的函数声明中,形参列表必须为每个参作为函数定义一部分的函数声明中,形参列表必须为每个参数的声明类型和参数名,例如:数的声明类型和参数名,例如:函数值类型
24、函数值类型 函数名函数名(参数类型参数类型1 形参名形参名1,参数类型参数类型2 形参名形参名2,);而在函数定义外的函数声明中,参数列表中可以只列出参数而在函数定义外的函数声明中,参数列表中可以只列出参数类型,如下所示:类型,如下所示:函数值类型函数值类型 函数名函数名(参数类型参数类型1,参数类型参数类型2,);第22页,共44页,编辑于2022年,星期日10.3.2 10.3.2 形参列表形参列表2.使用空列表使用空列表参数列表也可以是空的,表示没有参数。例如,范例参数列表也可以是空的,表示没有参数。例如,范例10-5中中第第11行的就声明了一个参数列表为空的函数,如下所示:行的就声明了
25、一个参数列表为空的函数,如下所示:int hello_mark(void)也可以写为:也可以写为:int hello_mark()要声明一个无形参的函数时,建议使用要声明一个无形参的函数时,建议使用void型作为函数列表型作为函数列表内容,以显式地说明不需要参数。内容,以显式地说明不需要参数。第23页,共44页,编辑于2022年,星期日10.3.2 10.3.2 形参列表形参列表3.实参到形参的值传递实参到形参的值传递调用函数时,只能把实参的值传递给形参,而形参不能改变调用函数时,只能把实参的值传递给形参,而形参不能改变实参的值。二者之间的值传递过程可以简单地理解为:调实参的值。二者之间的值传
26、递过程可以简单地理解为:调用函数后,每个形参都初始化为相对应的实参,如下所示:用函数后,每个形参都初始化为相对应的实参,如下所示:参数类型参数类型1 形参形参1=实参实参1;参数类型参数类型2 形参形参2=实参实参2;第24页,共44页,编辑于2022年,星期日10.3.3 10.3.3 函数值函数值当函数值类型不为当函数值类型不为void型时,函数返回值就可以作为函数调型时,函数返回值就可以作为函数调用表达式中的一个操作数来使用。一个函数的函数值一般用表达式中的一个操作数来使用。一个函数的函数值一般有两种用途:有两种用途:1.信息载体信息载体函数可以使用函数可以使用return语句将函数内的
27、某个值带到函数外,如语句将函数内的某个值带到函数外,如果需要返回的信息只需要一个数值来传递,那么可以选择果需要返回的信息只需要一个数值来传递,那么可以选择将这个信息作为返回值带到函数外。下面是两个把返回值将这个信息作为返回值带到函数外。下面是两个把返回值作为信息载体的例子。作为信息载体的例子。第25页,共44页,编辑于2022年,星期日10.3.3 10.3.3 函数值函数值2.指示执行状态指示执行状态当函数的执行有多个分支,而函数外部又需要知道函数内部当函数的执行有多个分支,而函数外部又需要知道函数内部执行的是哪一个分支时,可以在函数内部使用一个标志变执行的是哪一个分支时,可以在函数内部使用
28、一个标志变量来记录执行的分支,最后使用量来记录执行的分支,最后使用return语句将该值返回。语句将该值返回。在函数外部,通过检查该标志的值,就可以判断函数执行在函数外部,通过检查该标志的值,就可以判断函数执行了那一个分支。了那一个分支。第26页,共44页,编辑于2022年,星期日10.3.4 10.3.4 使用使用constconst形参形参在第在第4.5节中已经讨论了关于节中已经讨论了关于const限定词的功能和使用方法。限定词的功能和使用方法。在本章之前的程序代码中,很多形参在声明中也使用了在本章之前的程序代码中,很多形参在声明中也使用了const限定词,其作用是为了避免只读变量被修改,
29、即声限定词,其作用是为了避免只读变量被修改,即声明为明为const变量的形参在函数中不能被修改,这样做还可变量的形参在函数中不能被修改,这样做还可以最大限度地利用编译器的优化功能。以最大限度地利用编译器的优化功能。第27页,共44页,编辑于2022年,星期日10.3.4 10.3.4 使用使用constconst形参形参下列是前面的程序中的使用了下列是前面的程序中的使用了const限定词的部分函数声限定词的部分函数声明:明:int sum(const int a,const int b)/*范例范例10-3第第4行行*/int dif(const int a,const int b)/*范例范
30、例10-3第第12行行*/int pro(const int a,const int b)/*范例范例10-3第第16行行*/int cube(const int x)/*范例范例10-7第第4行行*/int search_data(const int array,const int size,const int target)/*范例范例10-8第第7行行*/第28页,共44页,编辑于2022年,星期日10.4 10.4 函数体函数体函数体是函数的具体功能操作的代码实现,是函数体是函数的具体功能操作的代码实现,是C函数的主体。函数的主体。在前面已经简要地介绍过函数体一般由变量定义、函数操在前
31、面已经简要地介绍过函数体一般由变量定义、函数操作和作和return语句三部分组成。本节将讨论函数体的一些特语句三部分组成。本节将讨论函数体的一些特性以及编写函数体需要注意的问题。性以及编写函数体需要注意的问题。注意:函数体可以为空。函数体为空的函数的什么都不做,注意:函数体可以为空。函数体为空的函数的什么都不做,不会执行任何操作。例如:不会执行任何操作。例如:void createButton(const int name,int flag)第29页,共44页,编辑于2022年,星期日10.4.1 10.4.1 定义变量定义变量变量定义就是定义函数中需要用到的变量。变量定义就是定义函数中需要用
32、到的变量。C函数中的变量函数中的变量定义必须都放在函数体的最前面,允许变量定义之间有空定义必须都放在函数体的最前面,允许变量定义之间有空行,但不能包括函数操作。行,但不能包括函数操作。第30页,共44页,编辑于2022年,星期日10.4.2 10.4.2 检查形参检查形参由于形参值从实参而来,如果调用时使用了异常的实参值,由于形参值从实参而来,如果调用时使用了异常的实参值,就有可能导致函数执行时发生一些异常错误。因此,在函就有可能导致函数执行时发生一些异常错误。因此,在函数体中对形参进行操作前,有必要先检查形参值的合法性。数体中对形参进行操作前,有必要先检查形参值的合法性。第31页,共44页,
33、编辑于2022年,星期日10.4.3 return10.4.3 return语句语句C函数中的函数中的return语句的功能是计算返回值,并结束函数。语句的功能是计算返回值,并结束函数。return语句一般由关键字语句一般由关键字return和表达式两部分组成,如和表达式两部分组成,如下:下:return 表达式表达式;执行该语句时,先计算表达式的值,该值为函数返回值,再执行该语句时,先计算表达式的值,该值为函数返回值,再结束函数。结束函数。第32页,共44页,编辑于2022年,星期日10.5 main10.5 main函数函数main函数是函数是C语言中的最特殊的函数。它是语言中的最特殊的函
34、数。它是C程序的入口,程序的入口,每一个每一个C程序都必须包含程序都必须包含main函数。但是由于一些历史的函数。但是由于一些历史的原因,导致原因,导致main函数的声明和使用有些混乱。本节将按函数的声明和使用有些混乱。本节将按照照C99标准来介绍标准来介绍main函数的标准声明形式和函数值类函数的标准声明形式和函数值类型,以及如何向型,以及如何向main函数传递参数,最后还讨论了函数传递参数,最后还讨论了main函数的函数值。函数的函数值。第33页,共44页,编辑于2022年,星期日10.5.1 main10.5.1 main函数的声明函数的声明main函数也是函数,它的标准声明也含有函数值
35、类型和形参函数也是函数,它的标准声明也含有函数值类型和形参列表。列表。C99标准规定,标准规定,main的返回值类型必须为的返回值类型必须为int,而,而形参列表可以为空,也可以带两个两个形参。其标准声明形参列表可以为空,也可以带两个两个形参。其标准声明形式如下:形式如下:int main(void)int main(int argc,char*argv)其中,第二种声明方式可以从外面程序接收参数。变量其中,第二种声明方式可以从外面程序接收参数。变量argc为为int型,保存参数个数;变量型,保存参数个数;变量argv为字符串数组型,以为字符串数组型,以字符串数组形式保存传入参数的内容。字符串
36、数组形式保存传入参数的内容。警告:除上述两种声明方法之外的其余所有声明方法都是不警告:除上述两种声明方法之外的其余所有声明方法都是不建议使用或是错误的。建议使用或是错误的。第34页,共44页,编辑于2022年,星期日10.5.2 10.5.2 函数值类型函数值类型C99标准中,只接受返回值类型为标准中,只接受返回值类型为int型的型的main函数。但是,函数。但是,在使用在使用main函数时,有的程序员甚至介绍函数时,有的程序员甚至介绍C语言的书常常语言的书常常会将函数值类型省略或者声明为会将函数值类型省略或者声明为void型。省略函数值类型型。省略函数值类型时不推荐的,而声明为时不推荐的,而
37、声明为void型则是错误的。型则是错误的。第35页,共44页,编辑于2022年,星期日10.5.2 10.5.2 函数值类型函数值类型1.不能省略函数值类型不能省略函数值类型由于由于C语言一开始只有语言一开始只有int型一种数据类型,所以开始的型一种数据类型,所以开始的main函数函数返回类型都是返回类型都是int型。既然只可能是一种类型,因此实现时便型。既然只可能是一种类型,因此实现时便允许省略返回类型,可以写为:允许省略返回类型,可以写为:main()或或main(int argc,char*argv)这种写法在这种写法在C89标准中是可以接受的,大部分标准中是可以接受的,大部分C编译器为
38、了兼编译器为了兼容之前的版本也允许这种声明方法。但这是不建议的声明容之前的版本也允许这种声明方法。但这是不建议的声明方法,在方法,在C99标准中要求编译器要对这种用法给以警告。标准中要求编译器要对这种用法给以警告。第36页,共44页,编辑于2022年,星期日10.5.2 10.5.2 函数值类型函数值类型2.2.不能使用不能使用voidvoid型作为函数值类型型作为函数值类型在在C C语言中,当一个函数语言中,当一个函数functionfunction无需返回值时,可以将其声明无需返回值时,可以将其声明为为voidvoid型,例如:型,例如:void function(void);void f
39、unction(void);因此,有的程序员就以为如果因此,有的程序员就以为如果mainmain函数不需要返回值时,也函数不需要返回值时,也可以声明为可以声明为voidvoid型,如下所示:型,如下所示:void main(void)void main(void)或或void main(int argc,char*argv)void main(int argc,char*argv)有些编译器(例如有些编译器(例如Visual C+6.0Visual C+6.0)也接受这种声明方法,)也接受这种声明方法,C C标准中明确规定标准中明确规定mainmain函数的返回值类型为函数的返回值类型为int
40、int型,因型,因此这种声明方法是错误的。此这种声明方法是错误的。第37页,共44页,编辑于2022年,星期日10.5.2 10.5.2 函数值类型函数值类型3.可以使用自定义类型作为函数值类型可以使用自定义类型作为函数值类型返回值类型也可以使用返回值类型也可以使用typedef自定义的数据类型名来代替,自定义的数据类型名来代替,例如:例如:#define int BIT32BIT32 main(void);或或#define int BIT32BIT32 main(int argc,char*argv)第38页,共44页,编辑于2022年,星期日10.5.3 10.5.3 向向mainmai
41、n函数传递参数函数传递参数main函数的形参列表可以为函数的形参列表可以为void型,此时型,此时main函数不接受函数不接受任何传入参数;也可以带两个形参,任何传入参数;也可以带两个形参,int型变量和字符串型变量和字符串数数组型变量,变量名建议为数数组型变量,变量名建议为argc和和argv。声明如下:。声明如下:int main(int argc,char*argv)其中,其中,argc的类型名的类型名int型也可以使用型也可以使用typedef自定义的数据自定义的数据类型名来代替,例如:类型名来代替,例如:#define int BIT32int main(BIT32 argc,cha
42、r*argv)第39页,共44页,编辑于2022年,星期日10.5.3 10.5.3 向向mainmain函数传递参数函数传递参数char*char*为字符串数组类型。此时,为字符串数组类型。此时,mainmain函数可以接受以函数可以接受以空格为间隔符的字符串序列。空格为间隔符的字符串序列。argcargc为输入字符串个数,为输入字符串个数,argvargv保存输入字符串内容。如果传入的参数为:保存输入字符串内容。如果传入的参数为:good,great;i can do itgood,great;i can do it会被解析为会被解析为6 6个参数,分别为(解析后的参数放在方括号内)个参数
43、,分别为(解析后的参数放在方括号内):第第1 1个参数:个参数:good,good,第第2 2个参数:个参数:great,great,第第3 3个参数:个参数:ii第第4 4个参数:个参数:cancan第第5 5个参数:个参数:dodo第第6 6个参数:个参数:itit第40页,共44页,编辑于2022年,星期日10.5.3 10.5.3 向向mainmain函数传递参数函数传递参数由于作为形参时,由于作为形参时,char*与与char*相等(在第相等(在第9.5节中会介节中会介绍),该声明还可以写为:绍),该声明还可以写为:int main(int argc,char*argv)但是为了与标
44、准保持一致,与大多数程序代码保持一致,不但是为了与标准保持一致,与大多数程序代码保持一致,不推荐这种声明方法,应当尽量使用推荐这种声明方法,应当尽量使用char*来声明来声明argv。第41页,共44页,编辑于2022年,星期日10.6 10.6 综合练习综合练习1。将范例。将范例9-11使用函数实现。使用函数实现。【提示】由于该程序中两次用到翻转字符串的功能,而其操【提示】由于该程序中两次用到翻转字符串的功能,而其操作是一模一样的,因此可以将该功能的操作封装在一个函作是一模一样的,因此可以将该功能的操作封装在一个函数中。将该函数声明为:数中。将该函数声明为:void reverse_stri
45、ng(char strMAX_STRING,int start,int end)第42页,共44页,编辑于2022年,星期日10.6 10.6 综合练习综合练习2。判断输入整数是否为素数,请使用函数实现。判断输入整数是否为素数,请使用函数实现。【提示提示】只能被只能被1和自身整除的数就是素数。把和自身整除的数就是素数。把2到这个数的到这个数的平方根作为除数,检查这个数是否能整除其中的某个数。平方根作为除数,检查这个数是否能整除其中的某个数。如果能,则为素数;不能,则不是。如果能,则为素数;不能,则不是。第43页,共44页,编辑于2022年,星期日10.6 10.6 综合练习综合练习3。证明哥德巴赫猜想:任何一个大于。证明哥德巴赫猜想:任何一个大于6的偶数都可以表示成的偶数都可以表示成两个素数之和。两个素数之和。【提示提示】n为大于等于为大于等于6的任一偶数,可分解为的任一偶数,可分解为a和和b两个数,两个数,分别检查分别检查a和和b是否为素数。如果是否为素数。如果a不是素数,则不成立;不是素数,则不成立;如果如果a是素数,继续检查是素数,继续检查b;如果;如果b不是,则猜想猜想不成不是,则猜想猜想不成立;如果立;如果b也是则成立。判断素数可以使用练习也是则成立。判断素数可以使用练习2的程序。的程序。第44页,共44页,编辑于2022年,星期日
限制150内