Q:为什么是2321呢?
A:这里我们使用 c/c++ 的文库看一下库函数 printf 的返回值是怎么讲的。
我们看到这两个图片后,对代码再进行分析:
这里打印出来的不是两千三百二十一,而是23--2--1。
3.函数声明
1.告诉编译器有一个函数叫什么,参数是什么,返回值类型是什么。但是具体是不是存在,函数声明决定不了。
2.函数的声明一般出现在函数的使用之前。要满足先声明,后使用。(变量也是一样的)
3.函数的声明一般要放在头文件中。
我们在这来看一段代码,使用实例进行讲解:
我们在这写一个 Add 函数:
#include <stdio.h> int main() { int a = 10; int b = 20; int ret = Add(a, b); printf("%d\n", ret); return 0; } int Add(int x, int y) { int c = x + y; return c; }
这段代码我们就是没做到先声明,后使用。编译器会报这样的错误:
它会报出 Add 未定义。但是我们确实已经定义了,这只是我们没有声明函数。
解决办法:我们在主函数的前面进行声明,声明方法如下:
//方法一 int Add(int x, int y); //方法二(省略参数名只在声明中允许,函数定义不可以) int Add(int , int )
我们也可以将自定义函数写在主函数前面,这样就不需要对自定义函数进行声明,并且还可以正常使用它。
改写如下:
#include <stdio.h> int Add(int x, int y) { int c = x + y; return c; } int main() { int a = 10; int b = 20; int ret = Add(a, b); printf("%d\n", ret); return 0; }
效果展示:
4.函数定义
函数的定义是指函数的具体实现,交代函数的功能实现。
就像函数声明中的 Add 函数那样,代码如下:
int Add(int x, int y) { int c = x + y; return c; }
5.函数递归
5.1 什么是递归?
A:程序调用自身的编程技巧称为递归。递归作为一种算法在程序语言中广泛应用。一个过程或者函数在其定义或者说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略:只需少量的程序就可描述出解题过程所需的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小。
5.2 递归的两个必要条件
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
递归成立必须满足上面两个条件。
递归使用的时候这两个条件是非常重要的,我们反其道行之,举例来看看这两个条件的重要性:
这里我们写一个没有限制的递归代码:
#include <stdio.h> int main() { printf("hehe\n"); main(); return 0; }
效果展示:
这就是没有两个必要条件的结果。因此,这两个条件是非常重要的。
我们再以一个题来加深一下印象:
题目:接受一个整形值(无符号),按照顺序打印它的每一位。例如:1234,输出 1 2 3 4。
#include <stdio.h> //%u - 无符号整数(都为正,即使给的负数也当正数看待) //%d - 有符号整数 void Print(unsigned int n)//封装一个Print函数 { if (n > 9) { Print(n / 10); } n = n % 10; printf("%d ", n); } int main() { unsigned int num = 0; scanf("%u", &num); Print(num); return 0; }
效果展示:
详解如下:
这段代码就清楚的向我们展示了这两个条件在递归中的重要性
1.如果没有限制条件会出现和打印 hehe 一样的问题,死循环。
2.每次递归都在接近限制条件。