函数
函数概述
函数可以看作是“黑盒子”,对应的输入会产生特定的结果或是返回某个数值,而其内部行为不需要考虑
函数调用各部分:
- 函数原型:告知编译器函数类型,可以放在main函数之前,也可以放在main函数内部
- 函数调用:导致函数的执行
- 函数定义:指定函数的具体功能
形参与实参:
- 形式参量是局部变量,是被调函数中的变量。在函数的原型中可省略形参名
- 实参是调用函数分配给被调函数的特定数值,无论何种形式的实参,执行时首先要求出其值,然后将该值复制给被调函数中相应的形参
ANSI C函数原型
为什么需要在函数原型中指明参数个数和类型?
不指明时的参数传递过程:
- 调用函数根据实参类型,将相应的实参放入堆栈
- 被调函数根据形参类型,从堆栈中读取数据
- 编译器不会检查参数类型!!
如果不确定参数的个数,如printf()
int printf(char *, ...);
递归
递归的基本原理
- 每一级函数调用都有自己的变量
- 每一次函数调用都会有一次返回,即返回到上一级的调用语句后,继续执行
- 位于递归调用前的语句和各级被调函数的顺序相同
- 位于递归调用后的语句和各级被调函数的顺序相反
尾递归
定义:把递归调用语句放在函数结尾,即return语句之前。是最简单的递归形式
递归和反向计算
例:编写一个函数将一个整数转换成二进制形式
解决:在递归调用前求出n%2的值,在递归语句之后进行输出。临界条件是,n<2时,n%2即为n,故直接输出
void to_binary(int n){
int r;
r=n%2;
if(n>=2) to_binary(n/2);
putchar('0'+r);
return;
}