函数
一个较大的程序一般是由若干个程序模块组成,每一个模块用来实现一个特定的功能。在C语言中,程序模块是由函数完成的。一个C程序可由一个主函数和若干个函数构成。由主函数调用其他的函数,其他的函数之间也可以相互调用。同一个函数可以被一个或者多个函数调用多次。
一个简单的函数调用的例子:
#include "stdio.h"
printstar(){ /* 定义printstar函数*/
printf("*********************");
}
print_msg(){ /* 定义print_msg函数*/
printf("How are you?\n");
}
main(){
printstar(); /*调用printstar函数*/
print_msg(); /*调用print_msg函数*/
printstar(); /*调用printstar函数*/
}
说明:
、一个C源程序文件由一个或者多个函数组成。
、C程序的执行是从main开始的,调用其他函数后流程返回到main函数。
、所有的函数都是平行的,即:在定义函数时是相互独立的,不允许嵌套定义。
、从用户角度看,函数有两类:标准函数(即库函数,如:printf())和用户自定义函数。
、从函数的形式来看,函数分为:无参函数(printstar();)和有参函数。
函数定义的一般形式
1、无参函数的定义形式
函数返回值的类型 函数名(){
说明部分
语句(执行部分);
}
有参函数的定义形式
函数返回值的类型 函数名(类型名1 形式参数名1,类型名1 形式参数名1,....)
{
说明部分
语句(执行部分);
}
实例见教材P47页的表5-1
说明:
、函数返回值的类型可以省略,默认为int类型,若函数没有返回值,则函数返回值的类型为void类型。
、函数名必须是合法的用户标识符,唯一且独有,同一个程序中函数名不能重复。
注意:函数的参数、变量、作用域和生存期等问题。
参数:分为形式参数和实际参数
形式参数(形参):定义函数时,函数名后面括号中定义的参数,如fun(int x){}中的x.
实际参数(实参):调用函数时,函数名后面括号中的参数,如fun(a,b);中的a,b。
变量:分为局部变量和全局变量
局部变量:是指在函数内部或者{}内部定义的变量。
全局变量:是指在函数外面定义的变量。
作用域:是指变量的作用范围。即:变量在哪个范围内有效。
生存期:是指从系统为变量分配内存空间开始到系统释放变量所占的内存空间为止的这一段时间。
注意:局部变量的作用域或者作用范围是定义这些变量的函数或{}内,而全局变量的作用域是整个程序,程序中的任何函数都可以使用。
函数的返回值
使用函数的目的大多说是为了计算出某个结果,这时需要把这个结果返回给我们,C语言中用return返回结果。
return (表达式);
说明:
、return语句中表达式的值便是函数的返回值,表达式的类型必须与函数首部的“函数返回值的类型”一致,如果不一致,系统将强制转换成首部的类型。
、()可以省略,例如:return 1;
、函数中可以出现多个return语句,但是只能执行其中的一个return语句。
、如果函数返回值类型名不是void,函数中必有return语句;类型名是void时,有两种情况:1、程序中不出现return语句;2、程序中出现return语句,但后面没有表达式。
函数调用
1、调用的一般形式:函数名(实参列表);
说明:
、函数调用时不能写返回值的类型,也不能写参数类型。实参的类型必须与函数定义时的形参的类型一致,并一一对应,实参之间用“,”隔开。
、实参可以是常量、变量、表达式等。
、函数调用时,是实参单项传递给形参的。fun(10,20);—单向—fun(int x,int y);
、自定义函数有返回值时,函数调用本身就代表一个值,因此,其可以作为表达式为另一方赋值。
函数调用语法规则(必须记住)
(1)、函数名前后一致。
(2)、实参与形参类型一致、个数相同且一一对应。
(3)、一般情况是函数先定义后调用。而且,将自定义函数放在main函数之前定义。否则需要在main函数中对自定函数进行声明。【编译顺序与执行顺序不同】
(4)、递归调用,即:函数可以调用自己。
函数调用方式:
(1)、函数语句,即把函数调用作为一个语句。例如:printstar();
(2)、函数表达式,即把函数出现在一个表达式中,这是要求函数必须有确定的返回值以参加表达式的运算。例如:c=2*max(a,b);
(3)、函数参数,即函数调