【C语言】函数的系统化精讲(二)1:https://developer.aliyun.com/article/1474649
2.2 static 修饰全局变量:
代码1
add.c
add.c
int g_val = 2024;
函数详解.c
#include <stdio.h> extern int g_val; int main() { printf("%d\n", g_val); return 0; }
代码1正常运行:
代码2:
add.c
static int g_val = 2018;
函数详解.c
#include <stdio.h> extern int g_val; int main() { printf("%d\n", g_val); return 0;
extern 是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使⽤ extern 进⾏声明,然后使⽤。
代码2在编译的时候会出现链接性错误。
结论:
⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤。
本质原因是全局变量默认是具有外部链接属性的,在外部的⽂件中想使⽤,只要适当的声明就可以使⽤;但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的。
2.3 static 修饰函数
其实 static
修饰函数和 static
修饰全局变量是⼀模⼀样的,⼀个函数在整个⼯程都可以使⽤,被static
修饰后,只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了。
代码1
add.c
int Add(int x, int y) { return x+y; }
函数详解.c
#include <stdio.h> extern int Add(int x, int y); int main() { printf("%d\n", Add(2, 3)); return 0; }
代码1是能够正常运⾏的
代码2
add.c
static int Add(int x, int y) { return x+y; }
代码2就出现了链接错误:
本质是因为函数默认是具有外部链接属性,具有外部链接属性,使得函数在整个⼯程中只要适当的声明就可以被使⽤。但是被 static 修饰后变成了内部链接属性,使得函数只能在⾃⼰所在源⽂件内部使⽤。
小总结
使⽤建议:
- 如果我们希望在函数外保留一个变量的值,并在下次进入函数时继续使用它,我们可以使用
static
修饰符。。 - 如果一个函数只想在所在的源文件内部使用,不想被其他源文件使用,就可以使用
static
修饰。
三、函数递归
3.1 递归是什么?
递归是C语言函数中不可避免的一个话题,那么什么是递归呢?
递归实际上是一种问题解决的方法,在C语言中,递归就是函数调用自身。
下面是一个非常简单的C语言递归代码示例:
#include <stdio.h> int main() { printf("今天你没熬夜吧?\n"); main();//main函数中⼜调⽤了main函数 return 0; }
上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演⽰递归的基本形式,不是为了解决问题,代码最终也会陷⼊死递归,导致栈溢出(Stack overflow)。
一直在死循环:
3.2.递归的限制条件
递归在书写时有两个必要条件:
• 递归必须有一个限制条件,当满足该条件时,递归停止。
• 每次递归调用后,逼近该限制条件。