【C语言】函数的系统化精讲(二)2

简介: 【C语言】函数的系统化精讲(二)

【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 修饰后变成了内部链接属性,使得函数只能在⾃⼰所在源⽂件内部使⽤。

小总结

使⽤建议:

  1. 如果我们希望在函数外保留一个变量的值,并在下次进入函数时继续使用它,我们可以使用static修饰符。。
  2. 如果一个函数只想在所在的源文件内部使用,不想被其他源文件使用,就可以使用 static 修饰。

三、函数递归

3.1 递归是什么?

递归是C语言函数中不可避免的一个话题,那么什么是递归呢?

递归实际上是一种问题解决的方法,在C语言中,递归就是函数调用自身。

下面是一个非常简单的C语言递归代码示例:

#include <stdio.h>
int main()
{
  printf("今天你没熬夜吧?\n");
  main();//main函数中⼜调⽤了main函数
  return 0;
}

上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演⽰递归的基本形式,不是为了解决问题,代码最终也会陷⼊死递归,导致栈溢出(Stack overflow)

一直在死循环:

3.2.递归的限制条件

递归在书写时有两个必要条件:

• 递归必须有一个限制条件,当满足该条件时,递归停止。

• 每次递归调用后,逼近该限制条件。

相关文章
|
1天前
|
C语言
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
17 0
|
1天前
|
C语言
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
4 0
|
1天前
|
C语言
C语言——函数递归
C语言——函数递归
4 0
|
1天前
|
C语言
C语言—函数(大化小方式的心脏)
C语言—函数(大化小方式的心脏)
2 0
|
2天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
15 2
|
2天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
2天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
2天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
2天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
2天前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
5 0