函数原型
函数的先后关系
我们把自己定义的函数isPrime()写在main函数上面
是因为C的编译器自上而下顺序分析你的代码,在看到isPrime的时候,它需要知道isPrime()的样子——也就是isPrime()要几个参数,每个参数的类型如何,返回什么类型
这样它才能检查你对isPrime()的调用是否正确
如果isPrime在main后面
有些编译器会出现error,有些会出现warning
上述编译器在识别到sum后,猜测了一个类型,但与后来我们自己定义的类型冲突了
可以只把自定义的函数的头放在最前面
上面的sum是原型,下面的sum是实际的函数头
函数原型
- 函数头,以分号“;”结尾,就构成了函数的原型
- 函数原型的目的是告诉编译器这个函数长什么样:名称、参数(数量及类型)、返回类型
旧标准习惯吧函数原型写在调用它的函数里面;现在一般写在调用它的函数前面
原型里可以不写参数的名字,但一般仍写上
参数传递
调用函数:
如果函数有参数,调用函数时必须传递给它数量、类型正确的值
可以传递给函数的值是表达式的结果,包括:字面量、变量、函数的返回值、计算的结果
类型不匹配?
调用函数时给的值与参数的类型不匹配是C语言传统上最大的漏洞
编译器总是悄悄替你把类型转换好,但那很可能不是你所期望的
后续语言C++/Java在这方面很严格
没有提示error或warning
传过去的是什么?
这样的代码能交换a和b的值吗
void swap(int a, int b); //形参(参数)
int main()
{
int a=5;
int b=6;
swap(a,b); //实参(值)
printf("a=%d b=%d\n", a, b);
return 0;
}
void swap(int a, int b) //形参(参数)
{
int t=a;
a=b;
b=t;
}
C语言在调用函数时,只能传值给函数
传值
每个函数有自己的变量空间,参数也位于这个独立空间中,和其它函数没有关系
过去,对于函数参数表中的参数,叫做“形式参数'”,调用函数时给的值,叫做“实际参数”
由于容易让初学者误会实参就是实际在函数中进行计算的参数,误会调用函数的时候把变量而不是值传进去了,所以不建议继续用这种方式称呼它们
本地变量
本地变量
函数每次运行,就产生了一个独立的变量空间,在这个变量空间中的变量,是函数的这次运行所独有的,称作本地变量
定义在函数内部的变量就是本地变量
参数也是本地变量
变量的生存期和作用域
生存期
什么时候这个变量开始出现,到什么时候消亡
作用域
在(代码的)什么范围可以访问这个变量(这个变量可以起作用)
对于本地变量,上述都是在“{ }”内
*在上面main中对a和b赋值后,对swap中的a、b并没有任何影响
本地变量的规则
- 本地变量是定义在块内的
它可以是定义在函数的块内
也可以是定义在语句的块内
也可以随便在一个大括号内
- 程序运行进入了这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了
- 块外面定义的变量在里面仍有效
- 块里面定义了和外面同名的变量则掩盖了外面的,但不能在一个块内定义同名的变量
- 本地变量不会被默认初始化
函数庶事
- 没参数时,在传统C中,“void f()”表示f函数的参数表未知,并不表示没有参数,要用“void f(void)”
- 逗号运算符
调用函数时的圆括号里的逗号是标点符号
eg. f(a,b) 标点符号
f((a,b)) 运算符
- 函数里的函数
C语言不允许嵌套定义
- 关于main
int main()也是一个函数
int main()括号中void可写可不写
return的0谁来看:Windows:if errorlevel 1…
Unix Bash:echo $?
Csh:echo $status