函数的定义与使用

什么是函数

函数是一块代码,接受零个多个参数,做一件事并返回0个或一个值
y = f(x)

函数结构

  1. 函数头
  2. 函数体
  3. 函数名
  4. 返回类型 void int bool
  5. 参数表 (int a ,   int b)

函数的优点

  1. 使程序变得更简短而清晰;
  2. 有利于以后的程序维护;便于团队开发分工合作
  3. 可以提高程序开发的效率;
  4. 提高了代码的可移植性。
当我们在修改的时候 不需要修改多处,而是修改一处,减少代码复制

从函数中返回值

  1. return ;
  2. return 表达式;
  3. 可以赋值给变量
  4. 甚至可以丢弃
    #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 ); 检查仅是类型
  • 后 函数定义

参数传递

  1. 如果函数有参数,调用函数必须传递给他数量,类型正确的值,可以传递给函数的值是表达式的结果
  2. 参数的类别不匹配 编译器会把类型自动转换 【这是c的最大漏洞】导致函数接受是int 传入是double 然后回被类型自动转换,c++和java很严格
  3. 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没有影响
    
  4.  每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
  5.  参数与值 来取代古老的叫法 实参【具体】 和形参【抽象】
对于函数会自动类型转化【不严谨~】
  • 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;
    }
  • 本地变量不会被默认初始化
  • 参数在进入函数的时候被初始化

变量的生存期和作用域

  • 生存期:什么时候这个变量开始出现,到什么时候它消亡了
  • 作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)
  • 对于本地变量,这两个问题的答案是统一的:大括号内---块【函数  语句块内也可以  】
main方法调用swap时,离开了main的变量空间,进入swap的变量空间,swap怎么修改ab 都跟main的变量空间的ab无关 

C语言的函数

  1. void f(void) 
  2.  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 ;也是有人看的  出现错误
    图片说明
在main 函数前还有一些函数调用为main函数做铺垫  返回值是有意义的
exit或者main函数中的return, 只能使用0~255之间的值. -1 的unsigned值就是255