亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C 语言函数精通:递归与内联函数实战案例详解

什么是 C 语言函数?

C 语言函数 是可复用的代码块,让程序更易理解、测试,且无需修改调用者即可修改实现。函数将代码分割模块化,提升效果。简而言之,大程序分解为多个称为函数的子程序。

C 语言函数精通:递归与内联函数实战案例详解

将大程序拆分为多个函数,便于单独管理。出错时可快速定位并修正故障函数。随时调用复用函数,自动节省时间与空间。

本教程学习内容:

库函数 vs 用户自定义函数

每个 C 程序至少有一个函数——main,但可包含任意数量函数。main() 是程序起点。

C 语言函数分两类:

  1. 库函数
  2. 用户自定义函数

区别:库函数无需编写代码,已存在于头文件中(程序开头 #include 引入)。直接按语法调用名字即可。printf、scanf 即库函数例。

用户自定义函数需自行编写函数体,在需要时调用执行特定操作。用户自定义函数虽由用户编写,但后续可成为 C 库一部分,这是 C 语言一大优势。

C 函数包含三个活动:

  1. 函数声明
  2. 函数定义
  3. 函数调用

函数声明

函数声明即写出函数名,是代码使用函数的强制环节。声明时仅指定函数名、返回类型、参数类型(参数名可选),类似变量声明。未声明不可使用。函数声明又称“函数原型”。

函数声明(原型)通常置于 main() 之前,通用形式:

return_data_type function_name (data_type arguments);

示例:声明计算立方的 cube 函数

#include <stdio.h>
/* 函数声明 */
int add(int a,b);
/* 声明结束 */
int main() {

注意:函数不一定返回值,此时用 void。如 void output_message(); 表示无返回值。

函数定义

函数定义即编写函数体。函数体由执行特定任务的语句组成,可以是单条或语句块。这是函数的强制部分。

int add(int a,int b) // 函数体
{
    int c;
    c=a+b;
    return c;
}

函数调用

函数调用即在程序需要时调用函数。调用时函数执行其设计的操作。函数调用在程序中是可选的。

result = add(4,5);

完整代码:

#include <stdio.h>
int add(int a, int b); // 函数声明
int main() {
    int a=10,b=20;
    int c=add(10,20); // 函数调用
    printf("Addition:%d\n",c);
    getch();
}
int add(int a,int b) // 函数体
{
    int c;
    c=a+b;
    return c;
}

输出:

Addition:30

函数参数

函数参数接收调用传递的值。按位置匹配:第一个实参对应第一个形参,以此类推。

默认 按值传递,即传递数据副本,被调函数修改不影响实参原变量。

演示按值传递:

int add (int x, int y);
int main() {
    int a, b, result;
    a = 5; b = 10;
    result = add(a, b);
    printf("%d + %d = %d\n", a, b, result);
    return 0;
}
int add (int x, int y) {
    x += y;
    return(x);
}

输出:

5 + 10 = 15

注意:a、b 传入 add 的值未变,因为只将值传给形参 x。

变量作用域

变量作用域指变量在程序代码中的可见范围。

C 语言中,函数内声明的变量为局部变量,函数外不可引用。所有函数外声明的变量为全局变量,整个程序均可访问。程序顶部 #define 定义的常量全程序可见。下例从 main 与用户函数均打印全局变量:

#include <stdio.h>
int global = 1348;
void test();
int main() {
    printf("from the main function : global =%d \n", global);
    test () ;
    return 0;
}
void test (){
    printf("from user defined function : global =%d \n", global);
}

结果:

from the main function : global =1348
from user defined function : global =1348

程序细节:

C 语言函数精通:递归与内联函数实战案例详解

  1. 声明全局整型变量 global=1348
  2. 声明并定义 test() 无参无返回,仅打印 global 证明全局变量随处可访问
  3. main 中打印 global
  4. 调用 test 打印 global

C 语言中,实参传给形参时,形参作为局部变量,函数退出即销毁。

使用全局变量需谨慎,因可在程序任意处被修改,易引发错误。使用前应初始化。

静态变量

静态变量具有局部作用域,但函数退出时不销毁。因此静态变量永久保持值,函数重入时仍可访问。声明时需初始化并加 static 前缀。

使用静态变量的程序:

#include <stdio.h>
void say_hi();
int main() {
    int i;
    for (i = 0; i < 5; i++) {
        say_hi();
    }
    return 0;
}
void say_hi() {
    static int calls_number = 1;
    printf("Hi number %d\n", calls_number);
    calls_number ++;
}

程序显示:

Hi number 1
Hi number 2
Hi number 3
Hi number 4
Hi number 5

递归函数

以阶乘为例:6! = 6×5×4×3×2×1。反复计算 fact × (fact-1) 直到 fact=1。

递归函数自我调用并包含退出条件以结束递归。阶乘的退出条件是 fact=1。递归通过“压栈”调用直到基准条件满足。

示例:

#include <stdio.h>
int factorial(int number);
int main() {
    int x = 6;
    printf("The factorial of %d is %d\n", x, factorial(x));
    return 0;
}
int factorial(int number) {
    if (number == 1) return (1); /* 退出条件 */
    else return (number * factorial(number - 1));
}

程序显示:

The factorial of 6 is 720

程序细节:

C 语言函数精通:递归与内联函数实战案例详解

  1. 声明递归 factorial 函数,接受整型参数返回阶乘。函数自我调用并递减参数直到基准条件。条件满足时,前序调用返回值相乘,最终得到阶乘。
  2. 声明并初始化整型变量 x=6,调用 factorial 打印结果。

参考下图理解递归机制:调用自身直到基准情况,随后收集前序值:

C 语言函数精通:递归与内联函数实战案例详解

内联函数

C 语言函数用于存放高频指令,模块化程序。调用函数时指令指针跳转到函数定义,执行完返回跳转点。这需要额外指针开销。内联函数将调用直接替换为实际代码,无跳转开销,所有操作在内联函数内完成。

内联函数适合小计算,不适合大量计算。语法:在函数名前加 inline 关键字。

inline function_name () { // function definition }

实现内联加法函数:

inline int add(int a, int b) // 内联函数声明
{
    return(a+b);
}
int main() {
    int c=add(10,20);
    printf("Addition:%d\n",c);
    getch();
}

输出:

Addition: 30

程序演示内联函数加法:直接在内联函数内返回相加结果,调用时仅传值无额外代码。

总结


C语言

  1. C++数组传递给函数实战指南
  2. C 语言用户自定义函数四大模式对比:参数与返回值的设计权衡
  3. C++ do-while 循环详解:语法、实战示例与嵌套循环
  4. C++ 运算符重载实战指南:语法、方法、限制与代码示例
  5. C++ 函数详解:从声明到调用的实战指南
  6. C 语言 calloc() 详解:零初始化动态分配原理与实战案例
  7. C 语言函数详解:定义、声明、调用与参数传递
  8. 掌握Verilog函数:高效RTL设计的复用利器
  9. MATLAB 函数详解:定义、工作区、输入输出与多种函数类型
  10. 精通 Python Lambda 函数:实用示例与最佳实践
  11. Python round() 函数详解与实战示例
  12. 精通 Python map() 函数:语法、示例与最佳实践