变量的作用域

引入问题

我们在函数设计的过程中,经常要考虑对于参数的设计,换句话说,我们需要考虑函数需要几个参数,需要什么类型的参数,但我们并没有考虑函数是否需要提供参数,如果说函数可以访问到已定义的数据,则就不需要提供函数形参。

那么我们到底要不要提供函数形参,取决于什么?答案就是变量的作用域(如果函数在变量的作用域范围内,则函数可以直接访问数据,无需提供形参)

变量作用域

**概念:**变量的作用范围,也就是说变量在什么范围有效。

变量的分类

根据变量的作用域不同,变量可以分为:

  • 全局变量

    说明:定义在函数之外,也称之为外部变量或者全程变量。

    作用域:从全局变量定义到本源文件结束。

    初始值:整型和浮点型,默认值是0;字符型,默认值是\0;指针型,默认值NULL

    举例:

     int num1;  // 全局变量,num1能被fun1、fun2、main共同访问void fun1(){}int num2;  // 全局变量,num2能被fun2、main共同访问void fun2(){}void main(){}int num3;  // 全局变量,不能被任何函数访问
    
  • 局部变量

    说明作用域初始值
    形式参数(形参)函数作用域随机值,需要手动赋初值
    函数内定义的变量函数作用域随机值,需要手动赋初值
    复合语句中定义的变量块作用域随机值,需要手动赋初值
    for循环表达式1定义的变量块作用域随机值,需要手动赋初值

    举例:

     // a,b就是形式参数(局部变量)int add(int a, int b){return a + b;}int add2(int a, int b){// z就是函数内定义的变量(局部变量)int z = a + b;return z;}int list(int arr[], int len){// i就是for循环表达式1的变量(局部变量)for(int i = 0; i < len; i++){// num就是复合语句中定义的变量(局部变量)int num = arr[i];}}
    

    使用全局变量的优缺点

    优点:

    1. 利用全局变量可以实现一个函数对外输出的多个结果数据。
    2. 利用全局变量可以减少函数形参的个数,从而降低内存消耗,以及因为形参传递带来的时间消耗。

    缺点:

    1. 全局变量在程序的整个运行期间,始终占据内存空间,会引起资源消耗。
    2. 过多的全局变量会引起程序的混乱,操作程序结果错误。
    3. 降低程序的通用性,特别是当我们进行函数移植时,不仅仅要移植函数,还要考虑全局变量。
    4. 违反了“高内聚,低耦合”的程序设计原则。

    总结:

    ​ 我们发现弊大于利,建议尽量减少对全局变量的使用,函数之间要产生联系,仅通过实参+形参的方式产生联系。

作用域举例

注意:

如果全局变量和局部变量同名,程序执行的时候,就近原则(区分作用域)

 int a = 10;  // 全局变量  全局作用域int main(){int a = 20;  // 局部变量  函数作用域printf("%d\n", a); // 20 就近原则for (int a = 0; a < 5; a++)  // 局部变量 块作用域{printf("%d", a); // 0 1 2 3 4  就近原则}printf("%d\n",a);  // 20 就近原则}

变量的生命周期

定义

**概念:**变量在程序运行中的存在时间(内存申请到内存释放的时间)

根据变量存在的时间不同,变量可分为静态存储方式动态存储方式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

变量的存储类型

语法:

 变量的完整定义格式: [存储类型] 数据类型 变量列表;

存储类型:

  • auto

    auto存储类型只能修饰局部变量,被auto修饰的局部变量是存储在动态存储区(栈区和堆区)的。auto也是局部变量默认的存储类型。

     int main(){int a;int b;// 以下写法等价于上面写法auto int a;auto int b;int a,b;// 以下写法等价于上面写法auto int a,b;}
    
  • static

    **修饰局部变量:**局部变量会被存储在静态存储区。局部变量的生命周期被延长。但是作用域不发生改变,不推荐

    **修饰全局变量:**全局变量的生命周期不变,但是作用域衰减,一般限制全局变量只能在本源文件内访问,其他文件不可访问。

    **修饰函数:**被static修饰的函数,只能被当前文件访问,其他引用该文件的文件是无法访问的,有点类似于java中private

  • extern

    外部存储类型:只能修饰全局变量,此全局变量可以被其他文件访问,相当于扩展了全局变量的作用域。

    extern修饰外部变量,往往是外部变量进行声明,声明该变量是在外部文件中定义的。起到一个标识作用。函数同理。

    demo01.c

     #include "demo01.h"int fun_a = 10;int fun1(){..}
    

    demo02.c

     #include "demo01.h"// 声明访问的外部文件的变量extern int fun_a;// 声明访问的外部文件的函数extern int fun1();int fun2();
    
  • register

    寄存器存储类型:只能修饰局部变量,用register修饰的局部变量会直接存储到CPU的寄存器中,往往将循环变量设置为寄存器存储类型(提高读的效率)

     for (register int i = 0; i < 10; i++){...}
    
static关键字的作用
  1. static修饰局部变量,延长其生命周期,但不影响局部变量的作用域。
  2. static修饰全局变量,不影响全局变量的生命周期,会限制全局变量的作用域仅限本文件内使用(私有化);
  3. static修饰函数:此函数就称为内部函数,仅限本文件内调用(私有化)。static int funa(){..}

内部函数和外部函数

  • 内部函数:使用static修饰的函数,称作内部函数,内部函数只能在当前文件中调用。
  • 外部函数:使用extern修饰的函数,称作外部函数,extern是默认的,可以不写(区分编译环境),也就是说本质上我们所写的函数基本上都是外部函数,建议外部函数在被其他文件调用的时候,在其他文件中声明的时候,加上extern关键字,主要是提高代码的可读性。

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

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

相关文章

Ansible在配置管理中的应用

Ansible是一个开源的配置管理和应用程序部署工具&#xff0c;它使用YAML语言编写的Playbook来描述配置和应用部署过程。通过SSH协议与目标机器通信&#xff0c;Ansible可以实现批量操作&#xff0c;极大地提升了工作效率。核心功能Ansible的核心功能包括&#xff1a;配置管理&a…

【学习路线】Go语言云原生开发之路:从简洁语法到微服务架构

一、Go语言基础入门&#xff08;1-2个月&#xff09; &#xff08;一&#xff09;环境搭建与工具链Go环境安装 官方安装&#xff1a;从golang.org下载安装包版本管理&#xff1a;g、gvm等Go版本管理工具环境变量&#xff1a;GOROOT、GOPATH、GOPROXY配置Go Modules&#xff1a;…

软件工厂:推动新质生产力的组织跃迁

引言&#xff1a;软件工厂的建设&#xff0c;不在于工具多&#xff0c;而在于理解深&#xff1b;不在于上线快&#xff0c;而在于体系稳。不仅是“看得见的流水线”&#xff0c;更是“看不见的组织变革”。在新质生产力的时代命题下&#xff0c;软件工厂正成为连接创新与效率、…

9.0% 年增速驱动!全球自清洁滚轮拖布机器人市场2031年将迈向 946 百万美元

自清洁滚轮拖布机器人是重要的智能清洁设备&#xff0c;采用滚筒式拖布结构&#xff0c;集扫拖功能&#xff0c;通过高速旋转加压擦洗地面&#xff0c;深度除污。其活水清洁系统可实时自清洁、回收污水&#xff0c;避免二次污染&#xff0c;提升清洁效率与效果&#xff0c;带来…

新能源工厂的可视化碳中和实验:碳足迹追踪看板与能源调度策略仿真

摘要新能源工厂明明用着风电、光伏等清洁能源&#xff0c;碳排放数据却依旧居高不下&#xff1f;某锂电池厂耗费百万升级设备&#xff0c;碳足迹却难以精准追踪&#xff0c;能源调度全靠经验“拍脑袋”&#xff0c;导致成本飙升。而隔壁企业通过可视化碳中和实验&#xff0c;碳…

数据结构自学Day13 -- 快速排序--“非递归利用栈实现”

一、快速排序回顾 快速排序本质上是**“分而治之”&#xff08;Divide and Conquer&#xff09;策略的递归应用。但递归其实就是函数栈的一种体现&#xff0c;因此我们也可以显式使用栈&#xff08;stack&#xff09;来模拟递归过程**&#xff0c;从而实现非递归版本的快速排序…

前端数据库:IndexedDB 基础使用

前言 在现代 Web 开发中&#xff0c;随着应用程序复杂度的增加&#xff0c;对本地存储的需求也越来越高。虽然 localStorage 和 sessionStorage 可以满足一些简单的数据存储需求&#xff0c;但当需要存储大量结构化数据或进行复杂查询时&#xff0c;它们就显得力不从心了。这时…

Kubernetes深度解析:企业级容器编排平台的核心实践

引言&#xff1a;Kubernetes的战略地位与核心价值在云原生技术生态中&#xff0c;​​Kubernetes​​已成为容器编排的事实标准。根据2023年全球云原生调查报告&#xff1a;全球​​96%​​ 的组织正在使用或评估Kubernetes企业生产环境Kubernetes采用率增长​​400%​​&#…

Netty中future和promise用法和区别

定义与概念 Future&#xff1a;表示一个异步操作的结果。它是只读的&#xff0c;意味着你只能查看操作是否完成、是否成功、获取结果或者异常等信息&#xff0c;但不能主动设置操作的结果。Promise&#xff1a;是 Future 的可写扩展。它不仅可以像 Future 一样查看操作结果&…

微算法科技(NASDAQ:MLGO)采用分布式哈希表优化区块链索引结构,提高区块链检索效率

随着区块链技术的快速发展&#xff0c;其在各个领域的应用越来越广泛。然而&#xff0c;区块链数据的存储和检索效率问题一直是制约其发展的瓶颈之一。为了解决这一问题&#xff0c;微算法科技(NASDAQ&#xff1a;MLGO)采用了分布式哈希表&#xff08;DHT&#xff09;技术来优化…

Jmeter的元件使用介绍:(三)配置元件详解01

Jmeter的配置元件有非常多&#xff0c;常用的有&#xff1a;信息头管理器、Cookie管理器、用户定义的变量、Http请求默认值、JDBC Connection Configuration、CSV 数据文件设置、计数器等&#xff0c;本文会对这些常用的配置元件一一介绍&#xff0c;还有其他很多配置元件&…

git 连接GitHub仓库

一、安装 git 包在官网下载 git 包二、通过SSH密钥与GitHub远程仓库连接1. 检查本地 SSH 密钥是否存在ls -al ~/.ssh如果看到 id_rsa 和 id_rsa.pub&#xff0c;说明已有密钥。2.如果没有&#xff0c;生成新的 SSH 密钥&#xff1a;ssh-keygen -t ed25519 -C "your_email…

如何通过AI扫描代码中的问题

代码质量其实在需求高压&#xff0c;业务快速迭代的场景下往往容易被人忽视的问题&#xff0c;大家的编码习惯和规范也经常会各有喜好&#xff0c;短期之内获取看不出来什么问题&#xff0c;但长此以往就会发现&#xff0c;屎山逐步成型了&#xff0c;而线上代码跑着往往就不想…

Java 大视界 -- Java 大数据机器学习模型在金融衍生品市场波动特征挖掘与交易策略创新中的应用(363)

Java 大视界 -- Java 大数据机器学习模型在金融衍生品市场波动特征挖掘与交易策略创新中的应用&#xff08;363&#xff09;引言&#xff1a;正文&#xff1a;一、Java 构建的金融数据处理架构1.1 多源异构数据实时融合1.2 新闻舆情与市场冲击建模二、Java 驱动的波动特征挖掘与…

Cartographer安装测试与模块开发(三)--Cartographer在Gazebo仿真环境下的建图以及建图与定位阶段问题(实车也可参考)

参数介绍之所以要首先介绍参数而不是实操&#xff0c;是因为大部分建图失败、漂移基本上都是参数设置错误引起的&#xff0c;或者说大部分都是TF存在问题&#xff0c;主要是坐标系Frame之间有冲突或者对不上等原因导致的&#xff0c;因此把参数放在前面介绍&#xff0c;了解了参…

uniapp nvue开发App 横竖屏切换丢失上下文导致 setTimeout和clearTimeout报错

报错内容如下 [JS Framework] Failed to find taskCenter (35). [JS Framework] Failed to execute the callback function:TypeError: c.clearTimeout is not a function reportJSException >>>> exception function:__WEEX_CALL_JAVASCRIPT__, exception:JavaSc…

Mirauge3D 赋能:全自动建模,让城市规划与建筑设计拥有高分辨率实景三维模型

在数字化浪潮席卷各行各业的当下&#xff0c;高精度、多元化的空间数据已成为基础测绘、智慧城市建设、自然资源管理等领域高质量发展的核心支撑。从城市交通网络的智能规划到国土空间的优化配置&#xff0c;从灾害监测的精准预警到生态环境保护的科学决策&#xff0c;空间数据…

Javaweb————学习javaweb的预备知识

❤️❤️❤️一.javase,javaweb,javaee的区别和联系 &#x1f499;&#x1f499;&#x1f499;javase: 通俗的来讲就是java技术栈&#xff0c;做java相关开发的基础&#xff0c;比如javaweb&#xff0c;javaee开发都是必备javase的基础的&#xff0c;包括java语言基础&#xff…

zabbix服务自动发现、自动注册及配置钉钉告警(小白的“升级打怪”成长之路)

目录 一、自动发现及自动注册 1、自动发现 2、自动注册规则 二、监控告警并发送电子邮件 1、设定发邮件的地址 2、设定发邮件的用户 3、设定监控及触发的条件 4、开始告警并设置触发发邮件 三、钉钉告警 1、配置zabbix-server 2、配置监控及触发 3、web页面操作 4、…

OSPF多区域

OSPF多区域划分的必要性 OSPF单区域存在的问题 LSDB 庞大&#xff0c;占用内存大&#xff0c;SPF计算开销大。 LSA洪泛范围大&#xff0c;拓扑变化影响范围大。 路由不能被汇总&#xff0c;路由表庞大&#xff0c;查找路由开销大 解决办法 划分区域可以解决上述问题 每个区域独…