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

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


文章目录

    • @[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关键字修饰局部变量、全局变量、函数,评论区欢迎讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/446829.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机飞手执照培训费用较高原因分析

无人机飞手执照培训费用较高的原因可以归结为多个方面&#xff0c;以下是对这些原因的具体分析&#xff1a; 一、课程内容的全面性和专业性 无人机飞手执照培训涵盖了从无人机基础知识到高级飞行技巧、从组装调试到故障维修的多个方面。这种全面性和专业性要求培训机构提供高…

具备技术一:Linux定时器

一、接口 1、创建定时器 timerfd_create 返回值&#xff1a;返回定时器文件描述符。原理&#xff1a;每隔一个超时时间系统会给描述符写入一个8字节数据代表已经超时几次。 clockid&#xff1a; CLOCK_REALTIME&#xff1a;以系统时间作为基准值&#xff08;若改变系统时间就…

SoapUI、Jmeter、Postman三种接口测试工具的比较分析

本报告从多个方面对接口测试的三款常用工具进行比较分析&#xff0c;以便于在特定的情况下选择最合适的工具&#xff0c;或者使用自己编写的工具。&#xff08;不同工具定位不同&#xff0c;我们只是主要从接口功能测试的角度进行分析&#xff09;。 报告中如果有哪些不合适的地…

AI开发者工具的双子星:Cursor与ChatGPT Canvas的区别

01—Cursor&#xff1a;沉浸式的开发体验 Cursor是一款旨在为开发者提供无缝编程体验的工具。它将AI的功能深度嵌入到开发者熟悉的环境中&#xff0c;便于在编码过程中获得即时帮助。开发者无需离开自己的操作界面&#xff0c;AI就能自动为其提供代码补全、错误检查和优化建议…

Android shape 设置solid透明度

Android shape 设置solid透明度 在Android中&#xff0c;您可以通过在shape drawable的<solid>标签中指定透明度来设置透明度。透明度是通过一个8位的值来指定的&#xff0c;其中0表示完全透明&#xff0c;255表示完全不透明。 要设置透明度&#xff0c;您需要使用#AAR…

什么是单片机?

单片机&#xff08;Single-Chip Microcomputer&#xff09;是一种集成电路芯片&#xff0c;是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能&#xff08;可能还包括显示驱动电路、脉宽…

zabbix报警设置

文章目录 I 通过脚本媒介,调用钉钉电话API。配置脚本设置脚本媒介II 配置发送邮件的信息案例:配置163邮箱配置接收媒介创建动作知识扩展DING 2.0 发钉钉钉机器人自定义webhookzabbix执行远程命令I 通过脚本媒介,调用钉钉电话API。 zabbix可以通过脚本调用钉钉电话API,需要…

哪些因素会影响 FMEA 实施的效果?

在探讨哪些因素会影响FMEA&#xff08;潜在失效模式及后果分析&#xff09;实施效果的问题时&#xff0c;我们不得不深入剖析FMEA的核心理念、实施流程及其在企业质量管理中的应用实践。FMEA作为一种系统性的预防性工具&#xff0c;旨在识别产品或过程中潜在的失效模式及其影响…

WriteUp - 江苏省领航杯 CTF 2024

文章目录 一、前言二、MISC高职组1、签到2、BASE拓展 3、PG 本科组1、签到2、veee3、seeme 三、WEB高职组1、aio2、robots3、web_sql_xxe 本科组1、web_sql_xxe2、提权3、acxi拓展 四、CRYPTO高职组1、兔兔2、1zRSA 本科组1、兔兔2、Evaluate 五、REVERSE高职组1、easyre2、16q…

云计算第四阶段 CLOUD2周目 01-03

国庆假期前&#xff0c;给小伙伴们更行完了云计算CLOUD第一周目的内容&#xff0c;现在为大家更行云计算CLOUD二周目内容&#xff0c;内容涉及K8S组件的添加与使用&#xff0c;K8S集群的搭建。最重要的主体还是资源文件的编写。 (*^▽^*) 环境准备&#xff1a; 主机清单 主机…

【Vue】Vue(八)Vue3.0 使用ref 和 reactive创建响应式数据

ref 创建&#xff1a;基本类型的响应式数据 **作用&#xff1a;**定义响应式变量。语法&#xff1a;let xxx ref(初始值)。**返回值&#xff1a;**一个RefImpl的实例对象&#xff0c;简称ref对象或ref&#xff0c;ref对象的value属性是响应式的。注意点&#xff1a; JS中操作…

前端开发笔记--html 黑马程序员1

文章目录 前端开发工具--VsCode前端开发基础语法VsCode优秀插件Chinese --中文插件Auto Rename Tag --自动重命名插件open in browserOpen in Default BrowserOpen in Other Browser Live Server -- 实时预览 前端开发工具–VsCode 轻量级与快速启动 快速加载&#xff1a;VSCo…

10个Python自动化脚本,让日常任务轻松便捷!

Python 以其简单易学的语法和强大的库支持,使得它成为实现自动化任务的理想语言.无论是个人日常工作,还是企业的流程优化,Python 都可以通过自动化脚本帮助节省时间、提升效率.以下是10个令人不可思议的 Python 自动化脚本,涵盖了从文件管理、网络爬虫到数据处理的各个领域. 1…

深度学习-24-基于keras的十大经典算法之残差网络ResNet

文章目录 1 残差网络(ResNet)1.1 ResNet简介1.2 ResNet结构2 模型应用2.1 加载数据2.2 构建模型SimpleResNet2.2.1 simple_resnet_block2.2.2 SimpleResNet2.2.3 实例化模型2.2.4 模型训练2.2.5 模型预测2.3 构建模型ResNet182.3.1 residual_block2.3.2 ResNet182.3.3 训练模型…

设计模式——门面模式 | 外观模式

哈喽&#xff0c;各位盆友们&#xff01;我是你们亲爱的学徒小z&#xff0c;今天给大家分享的文章是设计模式的——门面模式。 文章目录 定义通用类图1.通用结构2.优点3.缺点 使用场景注意事项1.一个子系统可以有多个门面2.门面不参与子系统内的业务逻辑 定义 定义&#xff1a;…

python画图|两个Y轴共享X轴

【1】引言 在前述学习中&#xff0c;对使用matplotlib模块输出图形已经非常熟练&#xff0c;但常见的画图方式并未穷尽&#xff0c;如两个Y轴共享X轴就没有探索过。 对此&#xff0c;我进行了一些学习&#xff0c;获得一些心得&#xff0c;在此和大家共享。 【2】官网教程 …

鸿蒙开发(NEXT/API 12)【使用fetchsync发送同步网络请求】远场通信服务

场景介绍 发送一个同步HTTP请求&#xff0c;也可以设置请求头和请求体等参数&#xff0c;并返回来自服务器的HTTP响应。常用于获取资源&#xff0c;支持通过拦截器来处理请求和响应。 接口说明 接口名描述Rcp_Response *HMS_Rcp_FetchSync(Rcp_Session *session, Rcp_Reques…

【Linux第一弹】- 基本指令

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

Window7上微信小程序开发工具上,小程序界面空白

目录 背景 解决方案 背景 微信小程序开发工具不断升级&#xff0c;自从1.06后不再支持Window7系统。安装1.05版本开发工具软件&#xff0c;新建小程序后&#xff0c;小程序界面空白&#xff0c;真机显示正常&#xff0c;但是对于开发者来说很不友好。 解决方案 点击“设置-&…

selenium的IDE插件进行录制和回放并导出为python/java脚本(10)

Selenium IDE&#xff1a;Selenium Suite下的开源Web自动化测试工具&#xff0c;是Firefox或者chrome的一个插件&#xff0c;具有记录和回放功能&#xff0c;无需编程即可创建测试用例&#xff0c;并且可以将用例直接导出为可用的python/java等编程语言的脚本。 我们以chrome浏…