一、函数概述

1.1 函数的作用

  • 函数的使用可以省去重复代码的编写,降低代码重复率
  • 函数可以让程序更加模块化,从而有利于程序的阅读,修改完善

1.2 函数的调用:产生随机数

调用函数时,需要关心:

  • 头文件:包含指定的头文件
  • 函数名字:函数名字必须和头文件声明的名字一样
  • 功能:需要知道此函数作用后才能调用
  • 参数:参数类型要匹配
  • 返回值:根据需要接受返回值

每次结果都一样,不够随机。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a;
    a = rand();
    printf("a=%d\n", a);
    return 0;
}

优化后:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int a,tmp;
    tmp = time(NULL);//获取系统当前时间
    printf("tmp=%d\n", tmp);
    srand(tmp);//设置系统时间为随机数种子
    a = rand();//生成随机数
    printf("a=%d\n", a);
    return 0;
}

1.3 函数定义格式

一般形式:

返回数据类型 函数名(形式参数列表)
{
    数据定义部分;
    执行语句部分;
    返回部分;
}

1.4 函数的组成

  • 函数名:见名知意,后面()
  • 形参列表:类型 变量名
  • 函数体:函数功能代码块
  • 返回值:return 变量;(变量类型需要和函数定义时的返回类型一致)

二、函数的执行

2.1 函数执行流程

  • 程序开始会先执行main
  • main函数中调用其他函数:先检查函数有没有定义;再检查函数原型;执行其他函数中的代码
  • main函数会接收其他函数的返回值并向下运行

2.2 函数的形参和实参

  • 函数定义时写在()中的是形参。
  • 函数调用时传递的参数时实参。

2.3 无参函数和有参函数和有返回值函数调用

  • 无参无返回值函数的定义和调用
#include<stdlib.h>
//函数的定义不能定义在函数的代码块里,必须在函数的外面定义函数
//符号加()代表这个是一个函数
//如果定义的函数没有形参,可以不填,也可以写void,但是返回值如果没有,需要写void
//  无参无返回值函数
//函数{}是函数体,所有的代码必须放在{}中
//函数结束之前需要返回值
//注意:返回值的类型看函数定义时,所需要的类型
void fun()
{
        printf("hello fun\n");
        printf("hello dfafa\n");
        return;
}
int main()
{
        printf("hello main\n");
        //函数的调用  函数名+()
        fun();
        system("pause");
        return 0;
}
  • 有参无返回值的定义和调用
//定义一个有参无返回值函数
//函数定义时()里面的参数叫形参,(因为这个形参只是形式上的参数,定义函数时没有给形参开辟空间)
//形参只有在被调用时才会分配空间
//形参 的定义  类型名+变量名
void  fun2(int  a, int  b)
{
        int c = 0;
        c = a + b;
        printf("a+b=%d\n",c);
        return;
}
int main()
{
        printf("hello main\n");
        //函数的调用  函数名+()
        //fun();
        //函数调用有参函数时,不可以不传参
        //调用函数时.()里面的参数叫实参,
        //实参的类型和形参的类型必须一致
        //函数调用时,实参的个数应该和形参的个数相同
        //实参为常量,可以为变量,可以为表达式,只要实参的类型和形参的类型匹配即可
        int x = 10;
        int  y = 20;
        //fun2(2,3)
        fun2(x,y);
        //fun2(x + y, x*y);
        system("pause");
        return 0;
}
  • 有参有返回值
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//有参有返回值
int  fun3(int  a, int b)
{
        int c = a + b;
        return c;
        //return  a + b;
}
int main()
{
        int  x = 10;
        int  y = 20;
        int  sum = 0;
        //调用有返回值函数时,可以不接返回值,也可以接
        //注意  返回的类型和所接收返回值的变量的类型需要相同
        //参数的传递,只能是单向传递(实参传给形参)
        //sum = fun3(x, y);
        printf("sum=%d\n",fun3(x,y));//将函数调用的返回值作为其他函数的参数
        system("pause");
        return 0;
}

2.4 函数的声明

  • 声明的作用就是告诉编译器这个东西在其他地方定义
  • 函数的声明,把函数的定义形式放在调用之前
  • 没有函数体就是函数的声明,有函数体就是函数的定义
  • 函数声明不用写函数体
  • 声明函数时需要加分号
  • 函数的声明不加extern 也是可以的
int main()
{
        int  x = 10;
        int  y = 20;
        int  sum = 0;
        //注意  返回的类型和所接收返回值的变量的类型需要相同
        //参数的传递,只能是单向传递(实参传给形参)
        //sum = fun3(x, y);
        //printf("sum=%d\n",fun3(x,y));//将函数调用的返回值作为其他函数的参数
        void swap(int a, int  b);
        swap(x,y);
        printf("x=%d   y=%d\n",x,y);
        system("pause");
        return 0;
}
void swap(int  a, int  b)
{
        int  c = a;
        a = b;
        b = c;
        printf("a=%d  b=%d\n", a, b);
        return;
}

2.5 return  和exit函数的区别

  • return  结束当前所在的函数

如果return在子函数中调用只会结束子函数,如果return在main函数中,会结束整个程序

  • exit 是一个库函数,用来结束整个程序

不管exit在哪里调用,都会结束整个程序