当前位置 博文首页 > CW_qian的博客:7月23日笔记C语言函数2

    CW_qian的博客:7月23日笔记C语言函数2

    作者:[db:作者] 时间:2021-08-25 21:46

    1.函数 function 某个功能模块
    ?? ?c语言,函数是完成某个特定的任务
    函数的名字可读性要强(比如英文名)?? ?
    函数的定义
    ?? ?返回值类型 函数名(函数的参数)
    ?? ?{
    ?? ??? ?
    ?? ??? ?return 返回值;
    ?? ?}?

    int func(int a,int b,int c)
    {
    ?? ?return a;
    }?? ?
    ?? ?
    int func(void)
    {
    ?? ?return 1;
    }
    int main()
    {
    ?? ?func();// 可以不接收func函数的返回值
    ?? ?int ret = func();// 接收func函数的返回值
    ?? ?
    ?? ?ret = func(1,2,3);
    ?? ?
    }

    总结: 1.函数名前面为返回值的类型,哪怕此函数没有返回值,也要写上void?
    ? ? ? ? ?2.?函数的返回类型要顶格
    ? ? ? ? ?3.函数返回类型与函数名空一格
    ? ? ? ? ?4.函数参数要写(),哪怕里面没有任何内容,如果没有内容最好这样写void func(void)
    ? ? ? ? ?5.函数调用者调用子函数的时候,可以不接收返回值
    ?? ?
    注意: 大括号表示函数的工作范围,如果离开此范围,数据就不属于此函数管辖
    ?? ?函数不能在main(){}里面实现,虽然不会报错,如果不调用,这个子函数是不会被执行的
    ?? ?所有函数的实现都在主函数外面实现
    ?? ?// 语法没问题,编程规范有问题,没有人这么写

    int main()// 主函数
    ?? ?{
    ?? ??? ?void func() // 子函数
    ?? ??? ?{
    ?? ??? ??? ?printf("func\n");
    ?? ??? ?}
    ?? ??? ?
    ?? ??? ?func();
    ?? ?}

    ??? ?return 返回值;
    ?? ?}?
    ?? ?// 正确写法
    ?? ?void func()
    ?? ?{
    ?? ??? ?
    ?? ?}


    函数一定有(),哪怕没有参数例如
    void func ?// 错误的写法?
    {}?? ?
    // 正确写法
    void func()
    {}


    主函数调用子函数
    void func()
    {
    ?? ?printf("hello func\n");
    }
    int main() // 程序的入口
    {
    ?? ?// 函数调用
    ?? ?// func; // 不会报错,函数的入口地址,是不会执行此函数
    ?? ?// 函数正确写法,函数名()
    ?? ?func();
    ?? ?
    ?? ?return 0;
    }


    // 被调用函数(子函数)?? ?
    void func(int a,int b) // a,b被称为形式参数(形参)
    {}
    void main()// 主调用函数(主函数)
    {
    ?? ?func(1,1);// 1,1表示实际参数(实参)?
    }


    函数的参数
    ?? ?实际实参 :在函数调用过程中,主调用函数传递给被调用函数的内容被称为实际参数
    ?? ?形式参数 : 被调用函数在()里定义的变量


    // 函数返回值
    ?? ?
    // 错误写法,void表示没有具体类型,所以不能接收函数的返回值
    void func()
    {
    ?? ?return 0; ?
    }
    // 正确写法
    void func()
    {
    ?? ?
    }?? ?



    return 后面的返回值要与函数名前面的返回值类型一致,否则出错?? ?
    return 只能返回一个结果
    写法如下
    int func(int a,int b)
    {
    ?? ?return a+b;
    }
    int main()
    {
    ?? ?int ret;
    ?? ?ret = func(); // 注意 func的返回值类型一定和ret的值类型一致,否则报错
    ?? ?printf("%d\n",ret);
    }


    模块化函数设计之多文件封装函数
    ?? ?多文件编译 ?gcc main.c func1.c -o main
    ?? ?
    ?? ?练习 :? 将函数封装到单独一个c文件,实现两个数值的相加
    ?? ?拓展 : 用穷举法实现打印质数,如果输入的是非质数
    ?? ?那么则输出离它最近的最小质数
    ?? ?
    ?? ?穷举法 : 指定一个范围,判断需要处理的数值是否在这个范围内
    ?? ?将这个数值与这个范围内的所有其它数据做比较,满足条件则为成功
    ?? ?否则失败
    ?? ?
    ?? ?练习目标 :
    ?? ??? ?1.穷举法(算法)
    ?? ??? ?2.函数调用问题(函数使用的思想问题)
    ?? ??? ?3.函数的封装问题(函数的多文件封装问题)
    ?? ??? ?4.标志位问题
    ?? ??? ?
    ?? ??? ?
    ?? ?编译器工作原理?? ?
    ?? ??? ?// 程序预编译,将头文件里面的内容考到源文件(c文件)
    ?? ??? ?gcc main.c -o main.i -E?
    ?? ??? ?
    ?? ?多文件编译,注意如果功能函数是独立放到其它c文件,编译的时候则需要添加此文件,过程如下
    ?? ??? ?gcc main.c func1.c -o main
    ?? ??? ?
    ?? ?多文件编译的时候不需要和头文件一起编译?? ??? ?
    ?? ??? ?
    ?? ??? ?
    ?? ?头文件的作用
    ? ? ? ? 1.是用来存放源文件中的公共资源例如
    ? ? ? ? 2.全局变量声明
    ? ? ? ? 3.普通函数声明
    ? ? ? ? 4.静态函数声明
    ? ? ? ? 5.宏定义
    ? ? ? ? 6.结构体、联合体定义
    ? ? ? ? 7.枚举常量列表的定义
    ?? ??? ?
    ?? ?头文件定义,例如 myhead.h ?头文件是 .h 后缀
    ?? ??? ?一般_MYHEAD_H与文件名相同,MYHEAD_H的底杆表示.h
    ?? ??? ?注意_MYHEAD_H是大写(默认),当然小写也行(不建议)
    ?? ??? ?
    ?? ?#ifndef _MYHEAD_H ? //判断语句,如果没有定义这个头文件
    ?? ?#define ?_MYHEAD_H ?// 就定义头文件

    ?? ?#include <stdio.h>

    ?? ?// 函数声明,提前告诉编译器,等下要调用此函数
    ?? ?extern int func(int a,int b);

    ?#ifndef _MYHEAD_H ? //判断语句,如果没有定义这个头文件

    ?#define ?_MYHEAD_H ?// 就定义头文件

    ?#include <stdio.h>

    ?// 函数声明,提前告诉编译器,等下要调用此函数
    ?extern int func(int a,int b);

    ?#endif // 头文件末尾?


    static静态作用
    ?? ?1.静态变量
    ?? ??? ?static全局变量和普通变量的区别 : static全局变量的初始值只初始化一次,如果不赋值,默认初始值为0
    ?? ??? ??? ?为了防止它在其它文件中被使用,防止文件污染
    ?? ??? ??? ?
    ?? ?2.静态函数,static函数只在函数对应的源文件有效,不能在其它文件使用?? ??? ?
    ?? ??? ?static 函数声明是不需要添加static关键字,但是使用的时候需要例如
    ?? ??? ?extern int func(void); // 存放到头文件,函数声明
    ?? ??? ?static int func(void ) // 函数实现
    ?? ??? ?{
    ?? ??? ??? ?....?? ?
    ?? ??? ?}
    ?? ?


    内联(lian)函数 ?inline?? ?
    ?? ?inline 当编译器发现某段代码右inline关键字的时候就会将这段代码插入到当前位置,加快运行效率
    ?? ?但是也会消耗一定的运行空间
    ?? ?
    ?? ?什么时候使用inline
    ?? ?(1)函数需要频繁被调用,代码最好不好超过5行
    ?? ?
    ?? ?inline函数注意事项
    ?? ?(1)内联函数在头文件实现,其它函数不要在头文件实现
    ?? ?(2)函数声明和函数实现都需要添加关键字inline,
    ?? ??? ?如果函数声明没有添加关键字,inline函数不生效
    ?? ?


    递归?? ?
    ?? ?自己调用自己,注意需要有结束条件,否则会出现内存溢出(段错误)
    ?? ?

    cs