C 编程中的函数示例:递归和内联
C 中的函数是什么?
C 编程中的函数 是可重复使用的代码块,它使程序更易于理解、测试,并且可以轻松修改而无需更改调用程序。函数将代码划分并模块化,以获得更好、更有效的结果。简而言之,较大的程序被划分为各种子程序,这些子程序被称为函数
当你将一个大型程序划分为多个函数时,单独管理每个函数就变得很容易了。每当程序中出现错误时,你都可以轻松调查有问题的函数并只纠正那些错误。你可以在需要时轻松调用和使用函数,这会自动节省时间和空间。
库与用户定义函数
每个“C”程序至少有一个函数,即主函数,但程序可以有任意数量的函数。C 中的 main() 函数是程序的起点。
在“C”编程中,函数分为两种类型:
- 库函数
- 用户定义函数
C 语言中的库函数和用户定义函数之间的区别在于,我们不需要为库函数编写代码。它已经存在于头文件中,我们总是在程序的开头包含头文件。您只需键入函数的名称并将其与正确的语法一起使用即可。Printf、scanf 是库函数的示例。
而用户定义函数是一种函数类型,我们必须编写一个函数主体,并在需要该函数在程序中执行某些操作时调用该函数。
C 中的用户定义函数始终由用户编写,但后来它可以成为“C”库的一部分。这是“C”编程的一大优势。
C 编程功能分为三个活动,例如,
- 功能声明
- 功能定义
- 函数调用
功能声明
函数声明意味着编写程序的名称。它是在代码中使用函数的必需部分。在函数声明中,我们只是指定我们将在程序中使用的函数的名称,就像变量声明一样。除非在程序中声明函数,否则我们不能使用它。函数声明也称为“函数 原型设立的区域办事处外,我们在美国也开设了办事处,以便我们为当地客户提供更多的支持。“
函数声明(称为原型)通常在 main() 函数上方进行,并采用一般形式:
return_data_type function_name (data_type arguments);
- 这款 返回数据类型:是返回给调用语句的值函数的数据类型。
- 这款 函数名: 后面跟着括号
- 参数 名称及其数据类型声明可选地放在括号内。
我们考虑以下程序,该程序展示了如何声明立方函数来计算整数变量的立方值
#include <stdio.h> /*Function declaration*/ int add(int a,b); /*End of Function declaration*/ int main() {
请记住,函数不一定返回值。在这种情况下,使用关键字 void。
例如,output_message函数声明表明该函数不返回值:void output_message();
功能定义
函数定义意味着只编写函数主体。函数主体由执行特定任务的语句组成。函数主体由单个语句或语句块组成。它也是函数的必需部分。
int add(int a,int b) //function body { int c; c=a+b; return c; }
函数调用
函数调用是指在程序需要时调用函数。每当我们调用一个函数时,它都会执行其设计的操作。函数调用是程序的可选部分。
result = add(4,5);
以下是完整的代码:
#include <stdio.h> int add(int a, int b); //function declaration int main() { int a=10,b=20; int c=add(10,20); //function call printf("Addition:%d\n",c); getch(); } int add(int a,int b) //function body { 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
请记住,传递给 add 函数的 a 和 b 的值不会改变,因为只有它的值被传递给了参数 x。
变量范围
变量作用域是指变量在程序代码内的可见性。
在 C 语言中,在函数内部声明的变量是该代码块的本地变量,不能在函数外部引用。但是,在所有函数之外声明的变量都是全局变量,可从整个程序访问。用 #定义 程序顶部的变量可从整个程序访问。我们考虑以下程序,该程序从主函数和用户定义函数打印全局变量的值:
#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
我们讨论计划细节:
- 我们声明一个整数全局变量,以 1348 作为初始值。
- 我们声明并定义一个 test() 函数,它既不接受参数也不返回值。此函数仅打印全局变量值,以证明全局变量可以在程序的任何地方访问。
- 我们在主函数中打印全局变量。
- 我们调用测试函数来打印全局变量值。
在 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。
此计算通过重复计算事实 * (事实 -1) 直到事实等于 1 来完成。
递归函数是一种调用自身并包含退出条件以完成递归调用的函数。在阶乘数计算的情况下,退出条件是事实等于 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); /* exiting condition */ else return (number * factorial(number - 1)); }
程序显示:
The factorial of 6 is 720
在这里,我们讨论计划细节:
- 我们声明一个递归阶乘函数,该函数接受一个整数参数并返回该参数的阶乘。该函数将调用自身并减少数字,直到退出或达到基本条件。当条件为真时,先前生成的值将相互相乘,并返回最终的阶乘值。
- 我们声明并初始化一个值为“6”的整数变量,然后通过调用阶乘函数打印其阶乘值。
考虑下图以更好地理解递归机制,该机制包括调用函数自身直到达到基本情况或停止条件,然后我们收集先前的值:
内联函数
C 语言中的函数用于存储最常用的指令。它用于模块化程序。
每当调用一个函数时,指令指针就会跳转到函数定义处。执行完一个函数后,指令指针会回到跳转到函数定义处的语句。
每当我们使用函数时,我们都需要额外的 指针 head 跳转到函数定义并返回到语句。为了消除这种指针头的需要,我们使用内联函数。
在内联函数中,函数调用直接被实际的程序代码取代。它不会跳转到任何块,因为所有操作都在内联函数内部执行。
内联函数主要用于小计算。当涉及大量计算时,它们并不适用。
内联函数与普通函数类似,只是在函数名前添加了关键字 inline。内联函数使用以下语法创建:
inline function_name () { //function definition }
让我们编写一个程序来实现内联函数。
inline int add(int a, int b) //inline function declaration { return(a+b); } int main() { int c=add(10,20); printf("Addition:%d\n",c); getch(); }
输出:
Addition: 30
上面的程序演示了如何使用内联函数对两个数字进行加法运算。如我们所见,我们只在内联函数中返回了两个数字的加法,而无需编写任何额外的代码。在函数调用期间,我们只需传递要执行加法的值即可。
总结
- 函数是一个小程序或子程序。
- 函数用于模块化程序。
- 库函数和用户定义函数是两种类型的函数。
- 函数由声明、函数体、函数调用部分组成。
- 函数声明和函数主体是强制性的。
- 在程序中,函数调用是可选的。
- C 程序至少有一个函数;它是主函数()。
- 每个函数都有一个名称、返回值的数据类型或void、参数。
- 每个函数都必须在 C 程序中定义和声明。
- 请记住,普通 C 函数中的变量 一旦我们退出函数调用就会被销毁。
- 传递给函数的参数不会改变,因为它们是通过值传递而不是通过地址传递的。
- 变量作用域是指变量在程序中的可见性
- 有全局变量和局部变量 C程序设计