c语言函数

目录

函数

探究一个问题a和b的交换

本地变量

函数的一些注意事项

下一篇: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(补码原理)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值