函数的定义与使用
什么是函数
函数是一块代码,接受零个多个参数,做一件事并返回0个或一个值
y = f(x)
函数结构
- 函数头
- 函数体
- 函数名
- 返回类型 void int bool
- 参数表 (int a , int b)
函数的优点
- 使程序变得更简短而清晰;
- 有利于以后的程序维护;便于团队开发分工合作
- 可以提高程序开发的效率;
- 提高了代码的可移植性。
当我们在修改的时候 不需要修改多处,而是修改一处,减少代码复制
从函数中返回值
- return ;
- return 表达式;
- 可以赋值给变量
- 甚至可以丢弃
#include<stdio.h> #include<stdbool.h> void f(){} int main(){ f;//可以运行的 f(); }
函数参数 变量
函数/原型声明要在main上面 !!!
void sum(int x , int y){...}
void plus(int x , int y){...}
void main(){}
- C的编译器自上而下顺序分析你的代码,如果main在上面 看到在main里面的方法,需要被编译器进行检查【几个参数 , 参数类型, 返回什么类型 这些都需要正确】 而因为函数在main下 还没被编译 就会出现问题
解决是 在main前面加一个头 如 sum(int x , int y); - 先 原型声明 【名称 , 参数(数量和类型) 返回类型】 也可以这样 void sum(int , int ); 检查仅是类型
- 后 函数定义
参数传递
- 如果函数有参数,调用函数必须传递给他数量,类型正确的值,可以传递给函数的值是表达式的结果
- 参数的类别不匹配 编译器会把类型自动转换 【这是c的最大漏洞】导致函数接受是int 传入是double 然后回被类型自动转换,c++和java很严格
- C语言在调用函数时,永远只能传值给函数
#include <stdio.h> void swap(int a , int b); int main(){ int a = 1 ; int b = 0 ; swap(a,b); printf("%d\n%d\n",a,b); return 0; } void swap(int a , int b) { int temp = a; a = b; b = temp; } a = 1 b = 0 没有发生改变 说明传入函数仅仅是值 虽然函数变量里的a b 会发生交换【函数调用完 生存周期就结束 函数里面的变量会被销毁】 但对main中的a b没有影响
- 每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
- 参数与值 来取代古老的叫法 实参【具体】 和形参【抽象】
对于函数会自动类型转化【不严谨~】
-
int sum(int a,int b ) { return a + b; } int main() { printf("%d",sum(1.1, 2.2)); //可以通过 }
本地变量
- 函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称为本地变量
- 定义在函数内部的变量就是本地变量
- 参数也是本地变量
- 定义在块内【语句{} 或者函数{} 以及随便来个大括号{}】进入块 变量存在 ;离开块 变量就消失
#include<stdio.h> int main(){ int a = 1 ; int b = 0 ; { int a = 2; int b = 3; //不影响外面 跟java不一样 !!! printf("%d\n%d\n",a,b); } printf("%d\n%d\n",a,b); return 0; }
- 块外面定义的变量里面仍然有效
#include<stdio.h> int main(){ int a = 1 ; int b = 0 ; { a = 100; b = 200; int c = 0;//跳出括号 变量c就消灭 } printf("%d\n%d\n",a,b); //a = 100 , b =100 return 0; }
- 本地变量不会被默认初始化
- 参数在进入函数的时候被初始化
变量的生存期和作用域
- 生存期:什么时候这个变量开始出现,到什么时候它消亡了
- 作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)
- 对于本地变量,这两个问题的答案是统一的:大括号内---块【函数 语句块内也可以 】
C语言的函数
- void f(void)
- void f() -> 它表示参数表未知,并不表示没有参数 【现在已经没法用 编译器】
#include <stdio.h> void func(); //欺骗编译器 //不推荐这种写法 int main() { int a = 100 ; int b = 100 ; func(a,b); return 0; } void func(double a , double b) { printf("in func a:%f , b:%f\n",a,b); // a 0.000000 b = 0.00000 }
逗号运算符
f(a,b) - >调用函数时的圆括号里的逗号是标点符号
f((a,b)) 是运算符
main 也是一个函数
- return 0 ;是有意义的 正常运行终止 报告给操作系统 >>>>批处理文件
- return !0 ;也是有人看的 出现错误
exit或者main函数中的return, 只能使用0~255之间的值. -1 的unsigned值就是255