函数

1. 函数引入

函数是代码中基础封装内容,主要解决代码中重复出现的功能模块,需要重复使用,并且是不同的位置使用,需要利用函数解决,主要解决的问题

  • 代码冗余

  • 代码阅读性极差

  • 代码的可维护性极差

函数需要大量的练习,整理,总结之后才可以完全掌握!!!

2. 比葫芦画瓢

C/C++ 中的 main 函数就是一个经典的函数模版,包含了函数的所有内容

int main(int argc, const char *argv[])
{
    // 功能代码
    return 0;    
}
  • int : 当前函数的返回值类型,函数执行完成之后对外的数据提供。当前函数要求返回值类型为 int 类型,在函数运行结束之后有且只允许返回 int 类型, 不允许其他类型返回,严格遵守【数据类型一致化原则】

  • main : 当前函数的名称,用于后续代码调用使用。函数名具备一定的唯一性。要求函数名必须满足命名规则【见名知意,动宾结构,约定俗成】。tips: main 函数整个 C/C++ 程序的入口。

  • (int argc, const char *argv[]) : 函数的形式参数列表,当前函数执行所需的外部数据,【巧妇难为无米之炊】。需要明确告知函数所需参数类型,和参数个数。

  • {...} : 函数封装的功能代码,核心内容!!!要求功能代码,核心内容,单一化。保证【高内聚,低耦合】

函数封装的模版

返回值类型 函数名(形式参数列表)
{
    函数体;
}
​
return_type function_name(parameter_types)
{
    function_body;
}

3. 函数分类

函数根据返回值类型和参数情况分为以下几类

  • 有参数有返回值函数【重点】

  • 无参数有返回值函数

  • 有参数无返回值函数

  • 无参数无返回值函数

函数类型【重点关注 函数返回值类型和参数类型】

4. 有参数有返回值函数【重点】

4.1 需求

用户提供两个 float 类型数据,函数运行之后,返回两个 float 数据的较小值。

4.2 需求分析【函数三要素分析】

  • 返回值类型:

    • 当前函数运行之后,需要告知用户提供的两个 float 类型数据的中较小值是哪一个。返回值数据对应的类型为 float 类型

    • 当前函数的返回值类型为 float 类型。

  • 函数名:

    • 【见名知意,动宾结构,约定俗成】

    • get_min get_min_float get_min_value

  • 形式参数列表:

    • 当前函数运行所需的外来数据是两个 float 类型数据,要求用户提供。所以当前函数的所需参数是两个 float 类型

    • 按照形式参数列表格式要求,参数类型需要根据 数据类型 参数名 固定方式提供,并且一一对应!!!按照当前要求,函数的形式参数列表为

    • (float n1, float n2), 小括号是参数列表的固定要求和格式,同时不同的参数采用逗号隔开,哪怕两个参数类型一致,也需要分开定义声明。

4.3 函数声明【重点】

函数声明是函数使用的重要组成部分,是用于明确告知当前代码存在对应函数

  • 存在函数名为 get_min 的函数

  • 函数参数类型是两个 float 类型数据,返回值类型为 float

  • 【重点】函数声明,在 main 函数之前完成。【先声明,再实现,后使用】

float get_min(float n1, float n2);

4.4 函数文档注释

文档注释是用于解释当前函数功能,参数所需,返回值类型情况,相当于当前函数的声明书。标准化,规范化的文档注释,可以提供给函数调用者,更为明确的使用方式。后续文档注释中是甚至于会提供案例代码,错误分析。

标准格式

/**
* 针对于当前函数的功能概述,功能描述,详情解释。如果函数使用较为复杂,甚至于有对应的案例代码和错误
* 分析。
*
* @param 参数名1 用于解释当前函数参数的类型,使用要求,参数限制,使用情况...
* @param 参数名2 用于解释当前函数参数的类型,使用要求,参数限制,使用情况...
* @return 当前函数返回值结果解释。
*/
/**
* 当前函数是将用户提供的两个 float 类型数据找出较小值,告知用户。
*
* @param n1 用户提供的 float 类型数据
* @param n2 用户提供的 float 类型数据
* @return 返回用户提供的两个 float 类型数据的较小值
*/
float get_min(float n1, float n2);

4.5 函数声明,实现和调用

#include <stdio.h>
​
/*
函数规范化流程
    1. 函数声明
    2. 函数实现
    3. 函数调用
*/
​
#if 0
【1. 函数声明】在 main 函数之前声明,明确告知当前代码存在对应函数,包括文档注释
#endif
/**
 * 当前函数是将用户提供的两个 float 类型数据找出较小值,告知用户。
 *
 * @param n1 用户提供的 float 类型数据
 * @param n2 用户提供的 float 类型数据
 * @return 返回用户提供的两个 float 类型数据的较小值
 */
float get_min(float n1, float n2);
​
int main(int argc, char const *argv[])
{
#if 0
    函数是条狗,哪里需要哪里吼
    【3. 函数调用】需要利用函数名 + 实际参数完成函数调用
    要求实际参数的个数,类型,顺序,必须满足函数声明。
    要什么,给什么,用什么,拿什么
#endif
    // ret 用于接受函数的运行结果,初始化为 0.0F 
    float ret = 0.0F;
​
    printf("函数运行之前 : %.2f\n", ret);
​
    /*
    利用函数名 + 实际参数调用函数。
    */
    ret = get_min(7.7F, 6.6F);
​
    printf("函数运行之后 : %.2f\n", ret);
​
    return 0;
}
​
#if 0
【2. 函数实现】函数实现在 main 函数之后完成
#endif
float get_min(float n1, float n2)
{
    /*
    需要使用 return 关键字,作用
        1. return 可以将关键字之后的数据返回到函数外部,要求
            return 之后的数据对应的类型,和函数声明的返回值
            类型一致,严格遵守【数据类型一致化】要求
        2. 函数运行到 return 关键字,函数运行终止。
    */
    /*
    如果使用 if else 方式完成代码,可以实现代码效果,但是【很 low】
    推荐
        三目运算符/条件运算符/三元运算符,要求必须对外提供数据。
        条件判断 ? 真对应结果 : 假对应结果。
    */
    /* if (n1 > n2)
    {
        return n2;
    }
    else
                    {
        return n1;
    }
    */
​
    return n1 > n2 ? n2 : n1;
}

5. 无参数有返回值函数

5.1 需求

函数返回一个 double 类型数据 20.5

5.2 需求分析【函数三要素分析】

  • 返回值类型:

    • 当前函数执行完毕之后,对外提供的数据反馈为 double 类型的 20.5

    • 返回值数据类型为 double

  • 函数名:

    • 【见名知意,动宾结构,约定俗成】

    • get_value get_double_value get_data get_double_data

  • 形式参数列表:

    • 当前函数执行无需任何的外来数据提供,无参数函数

    • 【C 语言重点要求】任何一个无参数函数必须有小括号作为函数的固定格式,并且在小括号中需要提供 void 占位,明确当前函数是无参数函数

    • 格式: (void)

5.3 函数声明

double get_value(void);

5.4 文档注释

/**
* 函数执行,返回一个 double 类型数据 20.5
*
* @return 返回值类型为 double,用户得到结果为 20.5
*/
double get_value(void);

5.5 函数声明,实现和调用

#include <stdio.h>
​
/*
函数规范化流程
    1. 函数声明
    2. 函数实现
    3. 函数调用
*/
​
#if 0
【1. 函数声明】在 main 函数之前声明,明确告知当前代码存在对应函数,包括文档注释
#endif
/**
 * 函数执行,返回一个 double 类型数据 20.5
 *
 * @return 返回值类型为 double,用户得到结果为 20.5
 */
double get_value(void);
​
int main(int argc, char const *argv[])
{
    double ret = 0.0;
    printf("函数调用之前 : %f\n", ret);
​
#if 0
    函数是条狗,哪里需要哪里吼
    【3. 函数调用】需要利用函数名 + 实际参数完成函数调用
    当前函数是一个无参数有返回值函数,函数运行无需任何外来数据。
    调用过程需要保留完整的小括号结构存在,不需要填充 void
#endif
    ret = get_value();
​
    printf("函数调用之后 : %f\n", ret);
​
    /*
    如果当前函数无参数需求,强行提供参数,编译器编译语法报错
    提示
        error: too many arguments to function ‘get_value’
    */
    /*
    C 语言中无参数函数如果省略必要 void 占位,会导致当前函数成为一
    个无固定参数类型,无固定参数个数函数,影响后续调用,和当前函数
    所需冲突。同时和 C++ 【重载 reload】技术冲突
    
    ret = get_value(10000);
    ret = get_value(5.5F, 20, 'A', "2333333");
    ret = get_value(21321);
    ret = get_value("有妖气!");
    */
​
    return 0;
}
​
#if 0
【2. 函数实现】函数实现在 main 函数之后完成
#endif
double get_value(void)
{
    return 20.5;
}

6. 有参数无返回值函数

6.1 需求

在控制台/终端,展示用户提供的 int 类型数据

6.2 需求分析【函数三要素分析】

  • 返回值类型:

    • 当前函数是将用户提供的数据,直接在控制台展示,没有运行之后的对外数据提供。当前函数无返回值类型,无返回结果

    • 函数的返回值类型为 void

  • 函数名:

    • 【见名知意,动宾结构,约定俗成】

    • print_value show_value print_int_value show_int_value consola_value

  • 形式参数列表:

    • 函数的执行目标是将用户提供的 int 类型数据,在控制台/终端进行展示参照,函数所需参数类型为 int

    • 格式: (int value)

6.3 函数声明

void show_int_value(int value);

6.4 文档注释

/**
* 在控制台/终端,打印展示用户提供的 int 类型数据
*
* @param value 用户提供用于展示的 int 类型数据
*/
void show_int_value(int value);

6.5 函数声明,实现和调用

#include <stdio.h>
​
/*
函数规范化流程
    1. 函数声明
    2. 函数实现
    3. 函数调用
*/
#if 0
【1. 函数声明】在 main 函数之前声明,明确告知当前代码存在对应函数,包括文档注释
#endif
/**
 * 在控制台/终端,打印展示用户提供的 int 类型数据
 *
 * @param value 用户提供用于展示的 int 类型数据
 */
void show_int_value(int value);
​
int main(int argc, char const *argv[])
{
#if 0
    函数是条狗,哪里需要哪里吼
    【3. 函数调用】需要利用函数名 + 实际参数完成函数调用
#endif
    int num = 10;
​
    show_int_value(num);
    show_int_value(1000);
    show_int_value(200000);
​
    return 0;
}
​
#if 0
【2. 函数实现】函数实现在 main 函数之后完成
#endif
void show_int_value(int value)
{
    printf("用户提供的 int 类型数据为 : %d\n", value);
}

7. 无参数无返回值函数

7.1 需求

函数实现直接在控制台打印 你好!世界!

7.2 需求分析【函数三要素分析】

  • 返回值类型:

    • 函数对外没有任何的数据提供和数据返回,所以当前函数无返回值类型

    • 对应返回值位置需要使用 void 占位

  • 函数名:

    • 【见名知意,动宾结构,约定俗成】

    • hello_world show_hello_world print_hello_world

  • 形式参数列表:

    • 当前函数执行无任何的外来数据需求,按照无参数 C 语言函数要求

    • 格式:(void)

7.3 函数声明

void show_hello_world(void);

7.4 文档注释

/**
 * 当前函数在控制台打印展示 你好!世界!
 */
void show_hello_world(void);

7.5 函数声明,实现和调用

#include <stdio.h>
​
/*
函数规范化流程
    1. 函数声明
    2. 函数实现
    3. 函数调用
*/
#if 0
【1. 函数声明】在 main 函数之前声明,明确告知当前代码存在对应函数,包括文档注释
#endif
/**
 * 当前函数在控制台打印展示 你好!世界!
 */
void show_hello_world(void);
​
int main(int argc, char const *argv[])
{
#if 0
    函数是条狗,哪里需要哪里吼
    【3. 函数调用】需要利用函数名 + 实际参数完成函数调用
#endif
    for (int i = 1; i <= 10; i++)
    {
        show_hello_world();
    }
​
    return 0;
}
​
#if 0
【2. 函数实现】函数实现在 main 函数之后完成
#endif
void show_hello_world(void)
{
    printf("你好!世界!\n");
}


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐