C-函数
C-函数
函数概念
对一段代码的封装,接收0或多个参数,执行封装的代码块,返回0或1个值
函数定义
调用函数
函数名(参数列表)
说明
1)有参数时,需要给出正确的参数数量和顺序,这些值会按顺序赋值给函数内的参数
2)没有参数时,参数列表为空
栗子
1 #include <stdio.h> 2 3 //calculate the sum between begin and end 4 int sum(int begin, int end){ 5 int i = 0; 6 int sum = 0; 7 for (i = begin; i <= end; i++) { 8 sum += i; 9 } 10 11 return sum; 12 } 13 14 int main(void) 15 { 16 int begin = 5; 17 int end = 10; 18 int sums = sum(begin, end); 19 printf("%d\n", sums); 20 return 0; 21 }
函数返回
1)函数执行完成后,会返回到调用到它的地方
2)return关键字用做从函数中返回值,return停止函数的运行,返回一个值,并回到调用它的位置,一个函数中可以出现多个return语句
3)从函数返回的值可以赋值给变量,传递给函数,丢弃
4)没有返回值的函数,返回类型为void,不能使用带值的return或函数中没有return,调用时不能做返回值的赋值;
有返回值的函数,必须使用带值的return
函数的先后关系
C语言的编译器是自上而下分析代码的
V
当在main函数中调用其他函数时,它需要知道这个函数的样子(函数名称,参数数量和类型,返回类型),
这样它才能知道对这个函数的调用是否正确
V
如果你把这个函数放在main函数的下面,编译器就会报错
V
我们也可以通过函数原型让编译器知道我们函数的样子
函数头,以分号结尾,构成函数的原型
栗子
1 #include <stdio.h> 2 3 int sum(int begin, int end); //函数原型(声明) 4 5 int main(void) 6 { 7 int begin = 5; 8 int end = 10; 9 int sums = sum(begin, end); 10 printf("%d\n", sums); 11 return 0; 12 } 13 14 //calculate the sum between begin and end 15 int sum(int begin, int end){ //定义 16 int i = 0; 17 int sum = 0; 18 for (i = begin; i <= end; i++) { 19 sum += i; 20 } 21 22 return sum; 23 }
参数传递
C语言函数是按值传递的
每个函数都有自己独立的变量空间,参数也位于这个独立的变量空间,和其他的函数没有关系
下面我们通过一个栗子来说明
1 #include <stdio.h> 2 3 void swap(int x, int y){ 4 int t = x; 5 x = y; 6 y = t; 7 printf("x=%d, y=%d\n", x, y); //x=2, y=1 8 } 9 10 int main(void){ 11 int a = 1; 12 int b = 2; 13 swap(a, b); 14 printf("a=%d, b=%d\n", a, b); //a=1, b=2 15 }
本地变量
函数每次运行时,都会产生一个独立的变量空间,在变量空间内定义的变量和函数的参数都称为本地变量
变量的生存周期和作用域
生存周期,从变量开始出现到变量消亡(大括号内)
作用域,可以访问这个变量的范围(大括号内)
本地变量的规则
1)本地变量是定义在块内的
它可以是定义在函数的块内
也可以定义在语句的块内
甚⾄可以随便拉⼀对⼤括号来定义变量
2)程序运⾏进⼊这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了
3)块外⾯定义的变量在⾥⾯仍然有效
4)块⾥⾯定义了和外⾯同名的变量则掩盖了外⾯的
5)不能在⼀个块内定义同名的变量
6)本地变量不会被默认初始化
参数在进⼊函数的时候被初始化了
注意
1)函数fun()表明函数的参数未知,当在main函数中调用fun函数时,编译器会根据
传入的参数来猜测函数的数量及类型,这可能会产生你不希望看到的结果;
函数fun(void)表明函数不接收任何参数;
2)C语言不允许在函数内定义另一个函数,即不允许函数嵌套定义