目录
下一篇:c语言数组
函数
函数是一块代码,接受零个或者多个参数,做一件事情,并返回0个或一个值
调用函数:函数名(参数值);
可以只写函数名不写括号,但是就不是这个意思了
函数可以有返回值
返回值也要注意单一出口原则
没有返回值的函数
void函数名(参数表)
不能使用带值的return
可以没有return
调用的时候不能做返回值的赋值
c语言的函数声明一定要在调用之前,不然会找不到
在c99之前如果把函数声明在调用之后,编译器会猜测这个函数的返回值、参数等,但是到从上到下发现真正的函数的时候发现返回值、参数等不一样就会报错
例如:现在main中有个调用sum(int,int),编译器猜测返回值是个int
但是下面的函数返回值是void就会报错
但是不同编译器,检测的严格程度不一样,报错也不一样
可以在调用前只声明函数头(函数的原型声明),声明可以写在main里面,参数的名称还可以不一样,但都是不推荐
在main函数调用后在函数体(函数的定义)
且声明和定义要一致
例如
void cheer()
main(){
cheer();
}
void cheer(){
printf("cheer!");
}
函数的自动类型转换:例如,函数参数定义的是double,但是调用的时候传参是int,就会把int自动转换成double,这也是c语言的漏洞,且声明变量后变量的类型不同,且把变量放在函数中不会报warning
函数本身也可以作为参数传递
c++和java就严格的多
探究一个问题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;
}
这段代码并没有实现a和b的交换
c语言在调用函数时,永远只能传值给函数,换句话说就是swap函数中的a和b与main函数中的a和b没有任何关系
传值:
每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
在递归中,这一次的运行和下一次的运行也是没有关系的
过去,对于函数参数列表中的参数,叫做形式参数,调用时给的叫实际参数
现在认为是参数(形参)和值(实参)的关系
本地变量
函数的每次运行就产生了一个独立的变量空间,在这个空间中的变量,是函数这次运行所独有的称作本地变量(局部变量)
定义在函数内部的变量就是本地变量,参数也是本地变量
变量的:
生存期:什么时候这个变量开始出现了,到什么时候它消亡了
作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)
对于本地变量,这两个问题的答案是同一的:大括号内——块(if大括号等也算)
就比方上一个小节中对swap函数的调用,离开了这个函数它的本地变量就消亡了
甚至可以随便拉一个大括号(局部代码块)来定义变量
{
定义的变量只能在这个大括号中使用
}
块外面定义的变量在块里面仍然有效
块里面如果定义了和外面同名的变量则会掩盖外面的变量
注意java不能这么干
int a=5;
{
int a=0;
printf("块里面的%d\n",a);
}
printf("块外面的%d\n",a);
不能在一个块内定义同名的变量
本地变量不会被默认初始化(会有随机的值)
参数在进入函数的时候被初始化了
函数的一些注意事项
没有参数时
void f(void),明确表示本函数不接收任何参数
还是void f(),在传统c中,它表示f函数的参数表位置,但并不表示没有参数
但是第二种情况在函数头声明时使用
比如函数是swap,声明时没有声明参数swap()
在调用时穿了两个整数,结果编译器查到最下面发现函数体的参数要的是double,但是函数声明中没有填任何东西,当然double也是合理的不会报任何错误,但是输出时就会出现错误
所以不要写出这样的原型来,一定要把参数写全
调用函数时,逗号运算符的区分
调用函数时()里的逗号是标点符号,不是运算符
但是如果写成这样:f((a,b))有两层括号就代表要先做括号中的逗号运算符了,表只传了一个参数
C语言不允许函数的嵌套定义(函数里面定义另一个函数不被允许)
这是个什么东西?
int I,j,sum(int a,int b);
表声明了一个返回值为int的函数sum
注:不建议这么写
return (1);这又是什么?
括号没有任何意义,但是可能被别人误解为一个函数调用
关于main
int main()也是一个函数
要不要写成int main(void)? 可以写
return 0有人看吗?对于操作系统的命令来讲是有意义的,传统上一个程序返回0表示运行正常,非零的值表示运行异常
在Unix下
./a.out后使用
$echo $?可以查看程序返回的结果
如果返回值是-1,得到的结果是255(补码原理)