C 中的变量作用域 – 局部和全局作用域解释

news2024/12/24 22:04:48

在编程中,您经常需要处理变量的范围。变量的作用域决定了是否可以在特定代码块内访问和修改它。

在本教程中,你将了解 C 编程语言中的变量作用域。您将看到一些代码示例,以帮助您了解局部变量和全局变量之间的差异。

目录

变量的作用域是什么?

C 中变量的局部作用域 – 嵌套块

C 中变量的局部作用域 – 嵌套块示例 2

C 中变量的局部范围 – 不同的块

C 语言中变量的全局范围

总结


正文起:

变量的作用域是什么?

在继续了解局部和全局变量作用域之前,让我们了解作用的含义。

简单来说,变量的作用域是它在程序中的生存期

这意味着变量的作用域是整个程序中的代码块,其中声明、使用和修改变量。

在下一节中,您将了解变量的局部作用域

C 中变量的局部作用域 – 嵌套块

在本节中,您将了解局部变量在 C 中的工作原理。您将首先编写几个示例,然后概括范围原则。

▶ 下面是第一个示例:

#include <stdio.h>

int main() 
{
    int my_num = 7;
    {
        //add 10 my_num
        my_num = my_num +10;
        //or my_num +=10 - more succinctly
        printf("my_num is %d",my_num);
    }
    
    return 0;
}

让我们了解上述程序的作用。

在 C 语言中,用 分隔代码块。左大括号和右大括号分别表示块的开始和结束。{}

  • 该函数有一个整数变量,该变量在外部块中初始化为 7。main()my_num
  • 有一个内部块试图向变量添加 10 .my_num

现在,编译并运行上述程序。下面是输出:

//Output

my_num is 17

您可以看到以下内容:

  • 内部块能够访问在外部块中声明的值,并通过向其添加 7 来修改它。my_num
  • 的值现在为 17,如输出所示。my_num

C 中变量的局部作用域 – 嵌套块示例 2

▶ 这是另一个相关示例:

#include <stdio.h>

int main() 
{
    int my_num = 7;
    {
        int new_num = 10;
    } 
    printf("new_num is %d",new_num); //this is line 9
    return 0;
}
  • 在这个程序中,函数在外部块中有一个整数变量。main()my_num
  • 另一个变量在内部块中初始化。内部块嵌套在外部块内。new_num
  • 我们正在尝试访问和打印外部块中内部块的值。new_num

如果您尝试编译上面的代码,您会注意到它无法成功编译。您将收到以下错误消息:

Line   Message
9      error: 'new_num' undeclared (first use in this function)

这是因为变量是在内部块中声明的,其范围仅限于内部块。换句话说,它是内部块的本地无法外部块访问。new_num

基于上述观察结果,让我们写下以下变量局部范围的通用原则:

{
	/*外部*/
    
{
    	
此部分开始之前外部的内容
        可以在这里访问
        
/*内部*/
        
}
     
内部的内容在这里无法访问
 }

 

C 中变量的局部范围 – 不同的块

在前面的示例中,您了解了如何无法从块外部访问嵌套内部块中的变量。

在本节中,您将了解在不同块中声明的变量的局部范围。

#include <stdio.h>

int main()
{
    int my_num = 7;
    printf("%d",my_num);
    my_func();
    return 0;
}

void my_func()
{
    printf("%d",my_num);
}

在上面的例子中,

  • 整数变量在函数内声明。my_nummain()
  • 在函数内部,打印出 的值。main()my_num
  • 还有另一个函数尝试访问和打印 的值。my_func()my_num
  • 当程序执行从函数开始时,函数内部会调用。main()my_func()main()

  现在编译并运行上面的程序。您将收到以下错误消息:

Line   Message
13     error: 'my_num' undeclared (first use in this function)

如果您注意到,在 上,函数尝试访问在函数内声明和初始化的变量。line 13my_func()my_nummain()

因此,变量的作用域仅限于函数,并且称为函数的 局部my_num main() main()

我们可以将局部作用域的概念概括地表示如下:

 

{

/*代码1*/
    此处无法访问代码2 的内容
    
}

{

/*代码2*/
    此处无法访问代码1的内容
    
}

C 语言中变量的全局范围

到目前为止,您已经了解了 C 变量的局部范围。在本节中,您将学习如何在 C 中声明全局变量。

▶ 让我们从一个例子开始。

#include <stdio.h>
int my_num = 7;

int main()
{
    printf("my_num can be accessed from main() and its value is %d\n",my_num);
    //call my_func
    my_func();
    return 0;
}

void my_func()
{
  printf("my_num can be accessed from my_func() as well and its value is %d\n",my_num);
}

在上面的例子中,

  • 变量在函数和 .my_nummain()my_func()
  • 我们尝试访问函数内部,并打印其值。my_nummain()
  • 我们在函数内部调用函数。my_func()main()
  • 该函数还尝试访问 的值并将其打印出来。my_func()my_nu

 该程序编译没有任何错误,输出如下所示:

//Output
my_num can be accessed from main() and its value is 7
my_num can be accessed from my_func() as well and its value is 7

在此示例中,有两个函数 – 和 。main()my_func()

但是,该变量不是程序中任何函数的局部变量。这种不是任何函数局部的变量被称为具有全局范围,称为全局变量。my_num

变量的全局范围原则可以总结如下:

此处声明所有全局变量
函数1()
	{
    
所有全局变量都可以在函数1中访问
    
}
函数2()
	{
    
所有全局变量都可以在函数2中访问
     
}
    

总结

在本教程中,你已了解本地范围和全局范围之间的差异。这是关于 C 语言中变量范围的入门教程。

在 C 中,有一些访问修饰符来控制变量具有的访问级别。声明变量时,可以使用相应的关键字更改访问权限。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

react源码解析3.react源码架构

这一章的目的是让我们认识一下react源码架构和各个模块。 在真正的代码学习之前&#xff0c;我们需要在大脑中有一个react源码的地图&#xff0c;知道react渲染的大致流程和框架&#xff0c;这样才能从上帝视角看react是怎么更新的&#xff0c;来吧少年。 react的核心可以用u…

头条权重如何在线查询,头条权重为0怎么办

每个用心用自媒体的创作者们&#xff0c;都听说过权重一说&#xff0c;权重高&#xff0c;也就意味着你的这个账号属于优质账号&#xff0c;推荐量会相应增加&#xff0c;还有一些自媒体会有创作者账号的白名单&#xff0c;优质账号会放在白名单里。 头条权重如何在线查询&…

适用于校园学生公寓的联网智能门锁

常言道&#xff1a;365行&#xff0c;行行出状元。每一个行业都有其特色&#xff0c;每一个行业都离不开一个共同的话题——安全。以联网智能门锁为例&#xff0c;早期的普通智能门锁主要应用于家庭、酒店等场景&#xff0c;能够满足几口之间、小规模流动人员场景使用需求。随着…

yolov8训练自己的数据集

太卷了&#xff01;&#xff01;&#xff01;&#xff01; 太卷了&#xff01;&#xff01;&#xff01;&#xff01;太卷了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;太卷了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;太卷了&#xff…

【Nginx】Nginx简介

1. 什么是nginx2. 正向代理与反向代理 2.1 概念2.2 区别 正向代理:客户端 <一> 代理 一>服务端反向代理:客户端 一>代理 <一> 服务端 3. 负载均衡4. 动静分离 1. 什么是nginx Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少…

2022年度【产业数字化金铲奖】重磅来袭!

出品|产业家 第二届金铲奖来了&#xff01; 过去的一年时间里&#xff0c;产业家清晰地看到&#xff0c;数实融合的潮水更加汹涌澎湃且势不可挡&#xff0c;越来越多的企业开始寻求数字化转型&#xff0c;它们来自金融、工业、农业、医疗、能源等等。 产业数字化&#xff0…

ARM汇编 : 汇编指令,伪指令,汇编程序格式

ARM汇编指令ARM指令集特点ARM工作模式ARM寄存器ARM32ARM64ARM64汇编指令内存存储访问指令LDR /STR 指令LDP/STP指令&#xff08;LDR 的变种指令&#xff0c;能够同时操做两个寄存器&#xff09;LDRB /SDRB 指令(只操作一个字节)LDRH /STRH 指令(只操作两个字节)LDUR/STUR指令 (…

Flink之转换算子和一些计算案例(Transformation)

Flink之转换算子 &#xff08;Transformation&#xff09; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lcaNaXGY645b2f5adabd496ebbee9edfedad6437.png)null)] 数据源读入数据之后&#xff0c;我们就可以使用各种转换算子&#xff0c;将一个或多…

雷达算法 | 一种适用于汽车雷达的聚类算法研究与分析

本文参考TI的一种适用于汽车雷达的聚类算法研究和实现.pdf文档&#xff0c;原文链接如下&#xff1a;https://www.ti.com.cn/cn/lit/an/zhca739/zhca739.pdfts1672973254109&ref_urlhttps%253A%252F%252Fwww.google.com.hk%252F。 由于不涉及硬件&#xff0c;因此本文仅对…

C生万物 | 反汇编深挖【函数栈帧】的创建和销毁

&#x1f451;作者主页&#xff1a;Fire_Cloud_1 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;万物之源——C 一文彻底搞懂函数栈帧创建和销毁的过程一、 什么是函数栈帧二、 理解函数栈帧能解决什么问题呢&#xff1f;三、 函数栈帧的创建和…

易基因|糖尿病大血管和微血管病变的表观遗传学调控机制(DNA甲基化+组蛋白修饰):综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2022年12月09日&#xff0c;《Frontiers in Endocrinology》杂志发表了题为“Epigenetic basis of diabetic vasculopathy”的综述文章&#xff0c;综述了表观遗传学修饰如DNA甲基化和组蛋…

电脑开机出现英文字母开不了机?小白操作技巧

在使用电脑的过程中&#xff0c;有时我们会遇到这种情况&#xff0c;就是电脑开机出现英文字母开不了机&#xff0c;而且还伴随着黑屏背景出现。出现这种问题&#xff0c;你们知道这是什么原因吗&#xff1f;以及我们该如何解决&#xff1f;下面这篇文章就可以告诉你&#xff0…

Foundry 中文文档发布啦

Foundry是一个Solidity智能合约开发工具链。Foundry管理您的依赖关系、编译项目、运行测试、部署&#xff0c;并允许您通过命令行和Solidity 脚本与链交互。 Foundry 中文文档是基于官方 Foundry book 的翻译&#xff0c;全面介绍 Foundry 所有功能。 使用Foundry的好处 Fou…

lvs负载均衡、nginx基本内容复习

文章目录前言一、LVSkeepalived实现高可用负载均衡二、三种不同模式实现负载均衡的区别与优缺点NAT模式DR直连路由模式TUN隧道模式三、Nginx之编译、负载均衡实现rr算法实现负载均衡ip_hash算法四、nginx平滑升级前言 一、LVSkeepalived实现高可用负载均衡 C/S架构和B/S架构&…

UWB室内定位系统的优势与好处

UWB定位系统的优势整理1、精度高&#xff1a;在室内定位领域&#xff0c;能够做到厘米级高精度定位的技术非UWB定位莫属。UWB采用TDOA&#xff08;到达时间&#xff09;算法&#xff0c;测量电磁波从发射端到达接收端所用的时间&#xff0c;分布在房间内的几个接收端同时接收到…

nginx小结二:高可用

nginx小结二&#xff1a;高可用nginx作为负载均衡器&#xff0c;所有请求都到了nginx&#xff0c;可见nginx处于非常重点的位置&#xff0c;如果nginx服务器宕机后端web服务将无法提供服务&#xff0c;影响严重。有鉴于此需要建立一个备份机&#xff0c;主服务器和备份机通过定…

用迭代局部搜索求解TSP问题(python)

文章目录1.迭代局部搜索(ILS)2.用ILS解决TSP问题2.1 函数模块2.2 主函数2.3 berlin52数据集测试1.迭代局部搜索(ILS) 关于迭代局部搜索(ILS iterated local search)的框架和应用总结可以阅读文献Iterated Local Search: Framework and Applications ILS的核心思想&#xff1a;…

【Kubernetes 企业项目实战】02、基于 Prometheus 和 K8s 构建智能化监控告警系统(下)

目录 一、可视化 UI 界面 Grafana 的安装和配置 1.1 Grafana 介绍 1.2 安装 Grafana 1.3 Grafana 界面接入 Prometheus数据源 1&#xff09;登录 grafana 2&#xff09;配置 grafana 界面 3&#xff09;导入的监控模板 二、kube-state-metrics 组件 2.1 kube-state-m…

JS的基础语法

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 JavaScript的书写形式 行内式 内嵌式 外部式 注释 输入输出 输入 输出 JS的语法规则 变量 数据类型 数字类型 字符串类型 布尔类型 运算…

YED-M724嵌入式4G Cat1 核心板介绍

YED-M724嵌入式4G Cat1 核心板简介YEDM724 核心板是由银尔达&#xff08;yinerda&#xff09;基于合宙Air724 模组推出的低功耗&#xff0c;超小体积&#xff0c;高性能嵌入式4G Cat1 核心板。YED-M724嵌入式4G Cat1 核心板特点1、支持5-16V 供电&#xff1b;2、工作环境为-35℃…