C语言函数是一组一起执行一个任务的语句。每个C程序都至少有一个函数,即main()主函数,所有简单的程序都可以定义其他额外的函数。
函数申明告诉编译器函数的名称,返回类型和参数。函数定义提供了函数的实际主体。
1. 定义函数
以下是max( )函数的源代码,会返回这两个数中较大的那个。
int max(int num1,int num2) { int result; //局部变量申明 if(num1 > num2) result = num1; else result = num2; return result; } |
在C语言中,函数是由一个函数头和一个函数主题组成。
(1)返回类型:一个函数可以返回一个值。return_type是函数返回值的类型。有些函数执行所需的操作二部返回值,在这种情况下,return_type是关键字void。
(2)函数名称:是函数的实际名称,函数名和参数列表一起构成了函数签名。
(3)参数:参数就像是占位符,当函数调用时,向函数传递了一个值,这值被称为实际参数,参数列表包括函数参数的类型,顺序,数量,参数是可选的,也就是说,函数可能不包含参数。
(4)函数主体:包含一组定义函数执行任务的语句。
2. 函数声明
函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
针对上面定义的max()函数,以下是函数声明:
int max(int num1,int num2); |
在函数申明中。参数的名称不重要,只有参数的类型是必须的,因此可修改函数申明:
int max(int,int ); |
在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必须要的,在这种情况下,应该在调用函数的文件顶部声明函数。
3. 调用函数
创建C函数时,会定义函数做什么,然后通过调用函数来完成以定义的任务。
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,需要传递其所需的参数;如果函数有一个返回值,则可以接收其返回值。
#include<stdio.h> /*函数申明*/ int max(int num1,int num2); int main() { /*局部变量*/ int a=100; int b=200; int ret;
/*调用函数来获取最大值*/ ret = max(a,b); printf("Max value is:%d\n",ret); return 0; }
/*函数返回两个数中较大的那个数*/ int max(int num1,int num2) { /*局部变量声明*/ int result; if(num1 > num2) retult = num1; else retult = num2; return result; } |
把max() 函数和 main() 函数放一块,编译源代码。当运行最后的可执行文件时,会产生下列结果:
Max value is:200 |
4. 函数参数
形参:在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据。实参:函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数。
形参和实参的功能是作数据传送,发生函数调用时,实参的值会传送给形参。
形参和实参的特点:
1) 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。
函数调用中发生的数据传送是单向的,只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
5. 函数返回值
- 函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的值,可以通过 return 语句返回 。
- 函数中可以有多个 return 语句,但每次调用只能有一个 return 语句被执行,所以只有一个返回值。
- 一旦遇到 return 语句,不管后面有没有代码,函数立即运行结束,将值返回。
int func() { int a=100,b=200,c; return a+b; return a*b; return b/a; } |
返回值始终a+b的值,也就是300;
- 没有返回值的函数为空类型,用 void 进行说明
void func() { printf(“Hello world!\n”); } |
- 一旦函数的返回值类型被定义为 void,就不能再接收它的值了。
int a=func(); |
- 为了使程序有良好的可读性并减少出错, 凡不要求返回值的函数都应定义为 void 类型 。
6. 变量的作用域规则
任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:
(1) 在函数或块内部的局部变量
(2) 在所有函数外部的全局变量
(3) 在形式参数的函数参数定义中
让我们来看看什么是局部变量、全局变量和形式参数。
3.6.1 局部变量
在某个函数或块的内部声明的变量称为局部变量。 它们只能被该函数或该代码块内部的语句使用; 局部变
量在函数外部是不可知的。
3.6.2 全局变量
的函数内部能访问全局变量。
全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。
3.6.3 函数形参
7. 总结
- 从整体上看, C 语言代码是由一个一个的函数构成的,除了定义和说明类的语句(例如变量定义、宏定义、类型定义等)可以放在函数外面,所有具有运算或逻辑处理能力的语句(例如加减乘除、 if else、 for、函数调用等)都要放在函数内部。
- 在所有的函数中, main() 是入口函数,有且只能有一个, C 语言程序就是从这里开始运行的。
- C 语言不但提供了丰富的库函数,还允许用户定义自己的函数。每个函数都是一个可以重复使用的模块,
通过模块间的相互调用,有条不紊地实现复杂的功能。可以说 C 程序的全部工作都是由各式各样的函数完成
的,所以也把 C 语言称为函数式语言 。 -
语言中所有的函数定义,包括主函数 main() 在内,都是平行的。也就是说,在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数,被调用者称为被调函数。函数还可以自己调用自己,称为递归调用。
-
main() 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。因此, C 程序的执行总是从 main() 函数开始,完成对其它函数的调用后再返回到 main() 函数,最后由 main() 函数结束整个程序。