“编程界的隐形斗篷:C语言作用域与生命周期的喜怒哀乐”

2024-01-06 08:12

本文主要是介绍“编程界的隐形斗篷:C语言作用域与生命周期的喜怒哀乐”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

少年们,大家好。我是博主那一脸阳光
在这里插入图片描述

前言:理解C语言作用域与生命周期,犹如掌握了变量在程序中的“活动地带”与“存活时刻”,有助于避免数据冲突、优化内存使用、提升代码质量和模块化程度,增强程序稳定性和安全性。

想象你是一位农场主,每个农田代表一个内存空间,种的作物就是变量。

每当你播种(声明并初始化变量)一颗土豆,这颗土豆就有了自己的生长周期(变量的生命周期)。普通田里的土豆(局部变量)收割完这一季就结束了生命,土地会被重新利用;但如果你在“永恒之田”种下的土豆(静态变量),那么即使这一季过去了,它还会留在土壤里,等到下一季继续供应美味(静态变量的生命周期贯穿整个程序运行期间)。

至于“extern”,就像是你和邻居农场主签订了一份协议,约定各自种一部分连片的地瓜,虽然地瓜是你家田里种的(变量在本文件定义),但邻居家的顾客也能过来挖自家田边的那部分地瓜(变量在其他文件中被声明为extern,可以访问此变量)。大家可以看下面文章进行理解。

C语言变量的作用域

#include<stdio.h>
int main()
{
int i=0;
for(i=0;i<10;i++)
{
int a=10;
}
printf("a=%d\n",a);
return 0;
}

作用域(scope)是程序设计概念,通常来说,一般程序代码中所用到的名字并不是有效(可用)的。而限定这个名字的可用性代码范围就是这个名字的作用域。
给两条建议:
1.局部变量的作用域是变量所在的局部范围。
2全局变量作用域是整个工程(项目)。

上面的C语言代码因为作用域的问题,出现了报错,也可以说是因为作用域的问题导致 ,变量a的生命周期提前结束了,正常来讲局部变量的生命周期,局部变量的生命周期结束于它所在函数执行完毕并返回之时。

在这里插入图片描述

局部变量的生命周期是在大括号内部的,而全局变量顾名思义就是大括号外面的称作’全局变量 ,可以在整个代码的任意位置使用,不受作用域的限制。请添加图片描述
下面是关于如何使用全局变量的三条语法性建议。
全局变量应在定义时初始化,确保程序启动时具备确定状态,避免未定义行为。
使用const限定符初始化全局变量可提升可读性,表明不应改变其初始值,并且可能得到编译器的优化处理。
避免过多全局变量,优先考虑封装在函数或类中,以增强代码模块化和降低耦合度。
到这里可能大家对低耦合不理解,我从百度找到了高内聚低耦合的概率。
高内聚低耦合是软件工程中的一种设计理念和原则,旨在提高软件模块的独立性和可维护性。

高内聚(High Cohesion)指的是一个模块内部的元素(如类的方法和属性)应紧密相关,共同完成一个相对单一的功能或职责。理想的高内聚模块只负责解决一组紧密相关的任务,对外呈现一致的接口,内部细节高度集中。这样做可以提高模块自身的完整性和可靠性,因为更改一个模块的需求时,对其他模块的影响较小。

低耦合(Low Coupling)是指模块之间的依赖关系应该尽可能简单、松散。也就是说,一个模块的变化不应该直接影响到其他模块的正常工作,模块间的交互应该是有限且明确的。低耦合设计的目标在于减少模块间的相互依赖性,使得模块可以独立开发、测试和维护,方便重构和替换。

 简洁一点就是,高内聚,见过齿轮没?一个碰着一个转动,而低耦合就是各扫门前雪。

请添加图片描述
如何全局变量和局部变量?重复了,优先执行谁呢?很显然是就近原则,局部变量优先执行。好,我们作用域先分享到这里。

变量是生命周期

我们人都是有生命的,一个人的生命周期是出生到死亡。变量程序的生命周期是指变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。
生命周期生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束。
全局变量的生命周期是:整个程序的生命周期。
在这里插入图片描述

staic的使用与静态变量

#include<stdio.h>
void tese()
{
int a=1;
a++;
printf("%d",a);
}
int main()
{
int i=0;
for(i=0;i<5;i++)
{
test();
}
return 0;
}

由于a是局部变量进入函数创建出函数销毁,所以a每次进来都是1,不会增加。这里设计到函数栈帧的问题后面会给大家分享,

`请添加图片描述好接下来我们用static来修饰一下这个全局变量,然后执行一下,看看是结果是什么样子的。
在这里插入图片描述
这里涉及到内存的分配,内存主要分为三个区(栈区,堆区,静态区)他们所用的方法和使用场次有所不同,我们有一张图总结
在这里插入图片描述

static修饰a以后 a就变成了静态变量,被static修饰的变量后就是静态变量,静态区中的变量生命周期比较长和程序生命周期一样长,static修饰局部变量,本质上影响了变量存储类型,一个局部变量是存在栈区的,但是被static修饰后就放在静态区了,因为储存类型的变化,生命周期跟着变化了,变长了。
作用域不变!
总结:

在深入探究程序生命周期与作用域的过程中,我们发现这两个概念构成了C语言编程的基础要素,对代码的正确性和性能有着深远影响。生命周期描述了变量从创建到销毁的过程,确保了内存的有效管理和释放,避免了诸如内存泄漏等常见问题。

作用域则界定了变量存在的有效区域,使得代码具备良好的组织性和可读性。理解局部变量、全局变量以及静态变量的作用域特性,能够帮助开发者规避数据冲突,提高代码的安全性与稳定性。同时,extern关键字的应用进一步凸显了作用域在模块化编程中的关键地位,使得不同文件间的全局变量和函数得以共享和协同工作。

总的来说,透彻理解并灵活应用程序生命周期和作用域的概念,不仅能提升编程技艺,更能助力我们编写出高质量、易于维护和扩展的C语言代码。在未来编程实践中,应当注重养成良好编程习惯,适时合理地运用这些原则,从而构建更为稳健、高效的软件系统。

这篇关于“编程界的隐形斗篷:C语言作用域与生命周期的喜怒哀乐”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/575745

相关文章

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安