Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19147
  • 博文数量: 15
  • 博客积分: 560
  • 博客等级: 中士
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 17:27
文章分类
文章存档

2011年(1)

2008年(14)

我的朋友
最近访客

分类: C/C++

2008-03-11 20:58:46

9.1

函数定义



返回类型 函数名(形式参数)
{
   声明
   语句
}


9.2 函数声明

函数声明一般采用函数原型(function prototype),函数原型与函数的定义一致,原型为如何调用函数提供了完整的描述:提供了多少实际参数,这些参数应该是什么类型,已经返回的结果是什么类型.


返回类型 函数名(形式参数);


9.3实际参数

形式参数(parameter)出现在函数定义中,它们以假名字累表示函数调用时提供的值;
实际参数(argument)是出现在函数调用中的表达式.

在c语言中,实际参数是通过值传递的:调用函数时,计算出每个实际参数的值并且把它赋值给相应的形式参数.在函数执行过程中,对形式参数的改变不会影响实际参数的值.从效果上来说每个形式参数的行为好像是把变量初始化与之匹配的实际参数的值.

实际参数的转换

  • 编译器在调用前遇到原型:就像适用赋值一样,每个实际参数的值被隐式的转换成相应形式参数的类型.
  • 编译器在调用前没有遇到原型.编译器执行的默认的实际参数提升:把float型的实际参数转换成double类型  执行整数的提升,把char型和short型的实际参数转换成int型.
数组长被用作实际参数.当形式参数是一维数组时,可以不说明数组的长度.如



int f(int a[])
{
......
}


虽然可以用运算符sizeof计算出数组变量的长度,但是它无法给出关于数组型形式参数的正确答案.

int f(int a[])
{
int len=sizeof(a)/sizeof(a[0]);/***WRONG***/
...
}


注意把数组名传递给函数时,不要在数组名的后面放置方括号.

9.4 return语句

非void函数必须适用return语句来说明将要返回的值.return后面的表达式经常只是常量或者变量
如果return语句中表达式的类型和函数的返回类型不匹配,那么系统将会把表达式的类型隐式转换成返回类型.

9.5 程序终止

exit函数
在main函数中执行return语句是终止程序的一种方法,另一种是调用exit函数,此函数属于.传递给exit函数的实际参数和main函数的返回值具有相同的含义:两者都说明程序终止时的状态,为了说明正常终止,传递0:  exit(0);
或者      exit(EXIT_SUCCESS);
传递      exit(EXIT_FAILURE); 说明异常终止
EXIT_SUCCESS和EXIT_FAILURE都是定义在中的宏.

9.6 递归函数


如果函数调用他本身,那么此函数就是递归(recursive).如果函数f1调用了f2,而f2稍后又调用了函数f1,这样是简介递归,但是必须确保函数f1和f2最终都可以终止.

Q&A

在程序的形式参数列表的后边,遇见过把形式参数的类型用单独的声明进行说明:
float average(a,b)
float a,b;
{
return (a+b)/2;
}
这种定义函数的方法来自K&R C,这种方法定义的函数编译器将不检测是否用正确数量的实际参数调用函数的,也不检测实际参数是否具有正确的类型.



阅读(442) | 评论(0) | 转发(0) |
0

上一篇:chp8 数组

下一篇:chp10 程序结构

给主人留下些什么吧!~~