【C语言】static关键字修饰局部变量、全局变量、函数

【C语言】static关键字修饰局部变量、全局变量、函数


前言

使用工具:
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关键字修饰局部变量、全局变量、函数,评论区欢迎讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kisorge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值