一、函数嵌套调用与链式访问
(一)概念与区分
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。 嵌套调用:
在函数定义中调用其他函数,但函数只能嵌套调用不能嵌套定义。
int max(int x)
{
add();//这样是可以的,但在这里自定义函数就不行了
return 0;
}
链式访问:
将其他函数的返回值作为参数来调用的叫链式访问。
printf("%d",printf("%d ",printf("%d",43)))
(注:printf的返回值为其打印在屏幕上的数目,如,printf("%d",43)的返回值为2)
二、函数和变量的声明
(一)总原则:先声明后定义,外部要加extern。
(二)变量的声明和定义(内部)
定义:可以在任意位置(除函数内)
声明:①要包含数据类型和变量名
②如:int x;
③定义要在声明之前
(三)函数的声明和定义
定义:自定义函数
声明:①要包含返回值类型、变量名和参数类型
②如:int max(int,int)
(四)声明注
1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数 声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。 3. 函数的声明一般要放在头文件中的。
三、静态库
(一)多模块文件
在大型工程,一个人无法处理庞大的工作量,而将工程划分为一个个模块就能很好解决这个问题,只要每个程序员分别处理其中一个或多个模块,最后将所有模块整合起来就可以了。
而承载这一模块的载体便可以是静态库;
(二)静态库内容
需要.c文件和.h文件
.c文件存放函数
.h文件存放声明
(三)静态库生成
在文件栏找到工程→鼠标右击找到属性→”常规“→”配置类型“→“应用程序”改”静态库“→编译
(四)使用
将生成的.lib文件添加到工程文件,使用#pragma comment(lib,"静态库名")加载静态库
四、函数递归
(一)概念
程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略 只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小
例:
#include <stdio.h>
int jie(int x)
{
if (x > 1)
return x * jie(x - 1);
else
return 1;
}
int main()
{
int n = 0;
scanf("%d", &n);
int g = jie(n);
printf("%d\n", g);
return 0;
}
(二)问题;栈溢出
nt factorial(int n)
{
if(n <= 1)
return 1;
else
return n * factorial(n-1);
}
在调试 factorial 函数的时候,如果你的参数比较大,那就会报错: stack overflow(栈溢出) 这样的信息。 系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一 直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。
五、递归与迭代
(一)递归与迭代的选择
1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。 2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。 3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开 销。