【C语言】static关键字修饰局部变量、全局变量、函数
文章目录
- @[TOC](文章目录)
- 前言
- 一、static关键字修饰局部变量
- 1.未加入static关键字
- 2.加入static关键字
- 3.小结
- 二、static关键字修饰全局变量
- 1.未加入static关键字
- 2.加入static关键字
- 3.小结
- 三、static关键字修饰函数
- 1.未加入static关键字
- 2.加入static关键字
- 3.小结
- 四、参考文献
- 总结
文章目录
- @[TOC](文章目录)
- 前言
- 一、static关键字修饰局部变量
- 1.未加入static关键字
- 2.加入static关键字
- 3.小结
- 二、static关键字修饰全局变量
- 1.未加入static关键字
- 2.加入static关键字
- 3.小结
- 三、static关键字修饰函数
- 1.未加入static关键字
- 2.加入static关键字
- 3.小结
- 四、参考文献
- 总结
前言
使用工具:
1.编译器:VSStudio2019
2.C Primer Plus 第六版-1
提示:以下是本篇文章正文内容,下面案例可供参考
一、static关键字修饰局部变量
1.未加入static关键字
#include<stdio.h>void text()
{int a = 0;a++;printf("%d ", a);
}
int main()
{int i= 0;for (i= 0; i < 10; i++){text();}return 0;
}
输出结果
2.加入static关键字
#include<stdio.h>void text()
{static int a = 0;a++;printf("%d ", a);
}
int main()
{int i= 0;for (i= 0; i < 10; i++){text();}return 0;
}
输出结果
3.小结
- 静态局部变量 a:
在函数text中,a被声明为静态局部变量,并初始化为0。
static关键字意味着变量a的生命周期贯穿整个程序运行期间,而不仅仅是函数text被调用的那一段时间。
尽管a是局部的(只在text函数内部可见),但它在程序执行期间只被初始化一次。
每次调用text函数时,a的值都会被保留,并在前一次调用的基础上增加1。
- 函数调用:
在main函数中,通过一个循环调用text函数10次。
每次调用text函数时,都会打印出变量a的当前值,并将其增加1。
- 静态局部变量的生命周期:静态局部变量的生命周期是整个程序运行期间,而不是仅在定义它的函数被调用期间。
- 初始化:静态局部变量只在程序开始时(或首次进入定义它的函数时)被初始化一次。
- 保留值:每次函数调用都会保留静态局部变量的值,并在上次的基础上进行修改。
普通的局部变量放在栈区,这种局部变量进入作用域创建,出作用域释放。
局部变量被static修饰后成为静态局部变量,这种变量放在静态区,创建好后,直到程序结束后才释放。
二、static关键字修饰全局变量
1.未加入static关键字
main.c
#include<stdio.h>
extern int a;int main()
{printf("%d",a);
}
max.c
int a = 2022;
2.加入static关键字
main.c
#include<stdio.h>
extern int a;int main()
{printf("%d",a);
}
max.c
static int a = 2022;
输出结果
3.小结
在C语言中,static关键字可以用于修饰全局变量,这会对全局变量的作用域和生命周期产生特定的影响。以下是关于static修饰全局变量的详细说明:
- 作用域
文件作用域:当static关键字用于修饰全局变量时,该全局变量的作用域仅限于定义它的源文件(即.c文件)。这意味着,即使你在其他源文件中声明了与这个全局变量同名的变量(使用extern关键字),它们也是相互独立的,不会互相影响。换句话说,static全局变量实现了文件级的封装,避免了命名冲突。
- 生命周期
程序生命周期:无论是否使用static关键字修饰,全局变量的生命周期都是整个程序运行期间。也就是说,从程序开始执行到程序结束,全局变量一直存在并可以被访问。static关键字在这里并不改变全局变量的生命周期。
- 使用场景
避免命名冲突:当你需要在多个源文件中定义同名但不相干的全局变量时,可以使用static关键字来限制它们的作用域,从而避免命名冲突。
隐藏实现细节:static全局变量可以被视为一种实现细节,它们对于模块外部的代码是不可见的。这有助于封装模块的内部实现,减少模块间的依赖。
全局变量本身具有外部链接属性,可使用extern关键字声明外部文件变量,实现跨文件变量使用。但是如果全局变量被static关键字修饰后,这个外部链接属性就变成了内部链接属性,全局变量作用域变小,全局变量只能在自己所在的源文件内部使用。
static关键字修饰全局变量,不改变生命周期,作用域变小。
三、static关键字修饰函数
1.未加入static关键字
main.c
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h> extern char compare(int a, int b);int main() {int num1, num2;char result;// 输入两个整数 printf("请输入第一个整数: ");scanf("%d", &num1);printf("请输入第二个整数: ");scanf("%d", &num2);// 调用比较函数 result = compare(num1, num2);// 输出比较结果 printf("%d %c %d\n", num1, result, num2);return 0;
}
max.c
char compare(int a, int b) {if (a > b) {return '>';}else if (a < b) {return '<';}else {return '=';}
}
输出结果
2.加入static关键字
main.c不变
max.c
static char compare(int a, int b) {if (a > b) {return '>';}else if (a < b) {return '<';}else {return '=';}
}
输出结果
3.小结
在C语言中,static关键字不仅可以修饰全局变量,还可以修饰函数。当static用于修饰函数时,它主要影响函数的作用域(也称为链接性),而对函数的生命周期没有直接影响(因为函数的生命周期总是整个程序运行期间)。
- 作用域
文件作用域:当static关键字用于修饰函数时,该函数的作用域被限制在定义它的源文件内。这意味着,其他源文件无法直接调用这个被static修饰的函数,即使它们通过正确的函数声明(使用extern关键字)尝试这样做也不行。因此,static函数提供了一种简单的封装机制,有助于隐藏模块的内部实现细节。
- 生命周期
对于函数来说,static关键字并不改变其生命周期。无论是否使用static修饰,函数的生命周期都是整个程序运行期间。也就是说,从程序开始执行到程序结束,函数始终存在并可以被调用(当然,前提是调用发生在函数的作用域内)。
- 使用场景
隐藏实现细节:static函数通常用于实现仅在定义它们的源文件中可见的辅助函数或工具函数。这些函数不需要在模块外部被调用,因此将它们声明为static可以避免命名冲突,并减少模块间的依赖。
总结:函数本身具有外部链接属性,可使用extern关键字声明外部文件函数,实现跨文件函数使用。但是如果函数被static关键字修饰后,函数只能在自己所在的源文件内部使用,不能在其他源文件内使用。
四、参考文献
C语言之static关键字详解
VSCode编译C语言代码
Visual Studio 2019 C语言程序(VS2019 C语言)
vs 2017中cmd运行一闪而过以及在vs中使用scanf
C语言学习之:visual studio 中 C 语言高效的注释方法
Visiual Studio如何添加C语言的依赖和一些快捷键
总结
本文仅仅简单介绍了【C语言】static关键字修饰局部变量、全局变量、函数,评论区欢迎讨论。