函数的嵌套调用和链式访问
一、函数的嵌套调用
函数的嵌套调用是指在一个函数中调用另一个函数。通过函数的嵌套调用,可以实现更复杂的功能和逻辑。
下面是一个示例:
int add(a, b):
{ return a + b}
int multiply(a, b):
{ return a * b}
int calculate(a, b):
{
result1 = add(a, b)
result2 = multiply(a, b)
return result1, result2
}
int main()
{
num1 = 2
num2 = 3
sum_result, product_result = calculate(num1, num2)
print("The sum is:", sum_result)
print("The product is:", product_result)
return 0;
}
- 在上面的示例中,有三个函数:add、multiply和calculate。add函数用于计算两个数的和,multiply函数用于计算两个数的乘积,calculate函数则是在其内部调用了add和multiply函数,并返回两个结果。
- 在主程序中,定义了两个变量num1和num2,分别赋值为2和3。然后调用calculate函数,将num1和num2作为参数传入。calculate函数内部先调用add函数计算两个数的和,再调用multiply函数计算两个数的乘积,并将两个结果分别赋值给result1和result`。最后,将两个结果作为元组返回。
最后,通过`print`语句将结果输出到屏幕上,函数的嵌套调用可以使程序更加模块化和可读性更好,同时也可以提高代码的复用性。
2、链式访问
把一个函数的返回值作为另外一个函数的参数。一般使用结构体和指针来实现
#include<string.h>
int main()
{
int len = strlen("abc");
printf("%d\n",len);
//这里输出函数调用了strlen函数,而函数的返回值被printf给当做参数了,这种调用就是链式访问
printf("%d\n",strlen("abc"));
//案例二
char arr1[20]={0};
char arr2[]="abc";
strcpy(arr1,arr2);
//这里打印的值是arr1而刚好strcoy返回值正是要arr1里得值
//这里%s表示的是打印类型是字符
printf("%s\n",strcpy(arr1,arr2));
return 0;
}
二、函数的声明和定义
1、函数声明
函数声明:
1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关
紧要。
2.函数的声明一般出现在函数的使用之前。要满足先声明后使用(这种情况是在函数定义在后面而如果是在前面定义函数的话一般来说是声明得较少了)
3.函数的声明一般要放在头文件中的。
2、函数定义
函数定义:
函数的定义是指函数的具体实现也就是说是功能的实现,交待函数的功能实现,声明可以无关紧要,但函数的实现就要靠定义来完成
三、函数递归
1、什么是递归?
- 程序调用自身的编程技巧称为递归(recusion)。递归做为一种算法在程序设计语言中广泛应一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复用。
- 见模较小的问题来求解,递归策略只需少量的程序就可杂的问题层层转化为一个与原问题相似的描述出解题过程所需要的多次重复计算,大地减少了程序的代码量。
- 递归的主要思考方式在于:把大事化小
void ping(unsigned int n)
{
if (n > 9)
{
//而这里是将非个位数的不同位数给求出来
ping(n / 10);
}
//这里是说将个位数求出来
ping("%d",n % 10);
}
int main()
{
//unsigned是表示int类型是无符号整数
unsigned int num = 0;
//假如说我们要输入一个值是1234,而打印出来的结果是1 2 3 4
scanf("%u", &num);
//函数ping用递归的方式来完成目标,函数可以打印参数数字的每一位
ping(num);
return 0;
}
2、递归的两个相对必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续(也就是说递归是具有有限性的)
- 每次递归调用之后越来越接近这个限制条件
- 递归层次不能太深
但,也是出问题的如栈溢出的情况,正常情况下函数是要使用到内存,而内存又分为几个区。而栈就是用于存放局部变量的区域,