「C系列」C 作用域规则
文章目录
- 一、C 作用域规则
- 二、案例
- 1. 块作用域(Block Scope)
- 2. 文件作用域(File Scope)
- 3. 静态作用域(Static Scope)
- 静态局部变量
- 静态全局变量
- 4. 函数参数的作用域
- 5. 结构体和联合体的作用域
- 三、相关链接
一、C 作用域规则
在C语言中,作用域(Scope)是指程序中定义的变量和函数可以被引用的区域。理解作用域规则对于编写清晰、可维护的代码至关重要。以下是C语言中作用域规则的一些关键点:
- 块作用域(Block Scope):
- 在C语言中,花括号
{}内的代码块定义了一个作用域。在这个作用域内声明的变量(包括使用static关键字声明的变量)只能在该作用域内被访问。 - 局部变量(Local Variables)就是在函数体或代码块内部声明的变量,它们具有块作用域。
- 如果在函数内部或代码块内部使用了与外部变量同名的局部变量,则在该作用域内局部变量将覆盖外部变量。
- 文件作用域(File Scope):
- 在函数之外声明的变量(不使用
static关键字)具有文件作用域。这些变量可以在声明它们的源文件的任何地方被访问,但不能被其他源文件直接访问(除非使用extern关键字)。 - 全局变量(Global Variables)就是在函数外部声明的变量,它们具有文件作用域。
- 函数作用域(Function Scope):
- 实际上,C语言并没有专门的“函数作用域”概念。在C语言中,函数的参数只在函数体内部(即块作用域)有效。
- 原型作用域(Prototype Scope):
- 函数原型中的参数名只在函数原型内部有效,它们不参与作用域规则。这意味着你不能在函数体外部直接通过参数名访问函数参数。
- 静态作用域(Static Scope):
- 在C语言中,
static关键字可以用于控制变量的作用域和生命周期。在函数内部,使用static关键字声明的变量具有静态存储期,并且在程序执行期间只会被初始化一次。这些变量在函数外部是不可见的,但在函数内部具有块作用域,并且在函数调用之间保持其值。 - 在函数外部,使用
static关键字声明的变量也具有静态存储期,但它们的作用域被限制在声明它们的源文件中。这意味着这些变量在该源文件的所有函数中都是可见的,但不能被其他源文件直接访问。
- 函数参数的作用域:
- 函数的参数在函数体内是可见的,并且其作用域是整个函数体。参数在函数体内部通过其名称进行访问。
- 结构体和联合体的作用域:
- 结构体和联合体中的成员变量在结构体或联合体内部具有块作用域。这意味着你可以通过结构体或联合体的实例(即结构体变量或联合体变量)来访问这些成员变量。
理解这些作用域规则有助于你编写更加清晰、可维护的C语言代码。在编写代码时,应尽量避免使用全局变量,因为它们可能会导致命名冲突和数据安全问题。相反,应该尽可能地使用局部变量和函数参数来传递数据。
二、案例
下面是一些详细的C语言作用域规则案例代码,用于说明不同作用域下的变量访问和可见性。
1. 块作用域(Block Scope)
#include <stdio.h>int main() {int block_scope_var = 10; // 块作用域变量,在main函数内部可见{int another_block_scope_var = 20; // 另一个块作用域变量,仅在此代码块内部可见printf("Inside block: %d\n", another_block_scope_var); // 可以访问}// printf("Outside block: %d\n", another_block_scope_var); // 错误:another_block_scope_var不可见printf("Outside block: %d\n", block_scope_var); // 可以访问return 0;
}
2. 文件作用域(File Scope)
#include <stdio.h>int file_scope_var = 30; // 文件作用域变量,在整个文件中可见int main() {printf("File scope var: %d\n", file_scope_var); // 可以访问return 0;
}// 如果在另一个源文件中,需要使用extern关键字声明该变量才能访问
// extern int file_scope_var;
3. 静态作用域(Static Scope)
静态局部变量
#include <stdio.h>void func() {static int static_local_var = 0; // 静态局部变量,只初始化一次,在函数调用之间保持值printf("Static local var: %d\n", static_local_var);static_local_var++;
}int main() {func(); // 输出: Static local var: 0func(); // 输出: Static local var: 1return 0;
}
静态全局变量
#include <stdio.h>static int static_global_var = 40; // 静态全局变量,只在当前文件中可见int main() {printf("Static global var: %d\n", static_global_var); // 可以访问return 0;
}// 在其他源文件中无法直接访问static_global_var,除非使用extern关键字并且知道其确切的声明
4. 函数参数的作用域
#include <stdio.h>void print_sum(int a, int b) {// a和b是函数参数,其作用域是整个函数体int sum = a + b;printf("Sum: %d\n", sum);
}int main() {print_sum(5, 3); // 调用print_sum函数,传递参数5和3// 在main函数中无法直接访问a和b,因为它们是print_sum函数的参数return 0;
}
5. 结构体和联合体的作用域
#include <stdio.h>typedef struct {int x; // 结构体成员变量,其作用域是整个结构体float y;
} Point;int main() {Point p = {1, 2.0f}; // 结构体实例p,可以访问其成员变量x和yprintf("Point x: %d, y: %f\n", p.x, p.y); // 访问结构体成员return 0;
}
这些案例代码涵盖了C语言中不同的作用域规则,并展示了如何在代码中使用它们。请注意,在尝试访问不可见的变量时,编译器会报错。
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C系列」C 简介
- 「C系列」C 基本语法
- 「C系列」C 数据类型
- 「C系列」C 变量及常见问题梳理
- 「C系列」C 常量
- 「C系列」C 存储类
- 「C系列」C 运算符
- 「C系列」C 判断/循环
- 「C系列」C 函数
相关文章:
「C系列」C 作用域规则
文章目录 一、C 作用域规则二、案例1. 块作用域(Block Scope)2. 文件作用域(File Scope)3. 静态作用域(Static Scope)静态局部变量静态全局变量 4. 函数参数的作用域5. 结构体和联合体的作用域 三、相关链接…...
【机器学习基础】Python编程10:五个实用练习题的解析与总结
Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机…...
【设计模式】结构型设计模式之 门面模式
介绍 门面模式(Facade Pattern)是一种常用的设计模式,属于结构型模式的范畴。它为子系统中的一系列接口提供一个简化的统一接口,即一个外观(Facade),从而使子系统更加容易使用。门面模式并不修…...
MAC地址简介
一、MAC和ip地址 很多同学只知道ip地址,同时也知道ip在网络通讯中的重要性,实际上要实现网络通信的话,除了ip地址外还需要MAC地址的配合,只有在这两种地址的配合之下才能完整的实现互联网的通信。但是由于MAC地址的使用࿰…...
五种网络IO模型
目录 前言 文件描述符 为什么要多种io模型 同步IO 1.阻塞IO 2.非阻塞IO 3.多路复用IO(事件驱动IO) select: poll: epoll: 4.信号驱动IO 异步IO 区别 前言 文件描述符 首先我们了解一下文件描述符是什么:…...
VSCode超过390万下载的请求插件
Thunder Client 是一款在 VSCode(Visual Studio Code)中非常受欢迎的 REST API 客户端插件,由Ranga Vadhineni开发,现在已经有超过390万的下载量。它允许开发者直接在编辑器内发送 HTTP 请求,查看响应。Thunder Client…...
前端 JS 经典:下载的流式传输
触发下载在浏览器中有两种方式:1. 客户端的方式 2. 服务器的方式 1. 服务器的方式 通过 a 元素链接到一个服务器的地址,然后需要后端人员配置,当用户点击按钮请求这个地址时,服务端给他加上一个响应头。Content-Disposition 设置…...
k8s面试题大全,保姆级的攻略哦(三)
目录 1、简述ETCD及其特点? 2、简述ETCD适应的场景? 3、简述什么是Kubernetes? 4、简述Kubernetes和Docker的关系? 5、简述Kubernetes中什么是Minikube、Kubectl、Kubelet? 6、简述Kubernetes常见的部署方式? 7、简述Kubernetes如何实现集群管理? 8、简述Kubern…...
从年金理论到杠杆效应,再到财务报表与投资评估指标
一、解释普通年金终值和普通年金现值的概念。 普通年金终值:以利率为1%,每期收款100元,5期为例,普通年金终值的折算过程如图: 普通年金现值:以利率为1%,每期收款100元,5期为例&am…...
K8S - 用kubectl远程访问内网的k8s集群
在之前的文章 K8S - 在任意node里执行kubectl 命令 介绍过, 通过任何node 的主机, 用kubectl 管理集群是很简单 无非就是两个步骤: 下载 k8s master 上的admin.conf在当前主机配置 K8SCONFIG 环境变量指向 下载的config file 其他内网主机也适用 其…...
STM32F103C8移植uCOSIII并以不同周期点亮两个LED灯(HAL库方式)【uCOS】【STM32开发板】【STM32CubeMX】
STM32F103C8移植uC/OSIII并以不同周期点亮两个LED灯(HAL库方式)【uC/OS】【STM32开发板】【STM32CubeMX】 实验说明 将嵌入式操作系统uC/OSIII移植到STM32F103C8上,构建两个任务,两个任务分别以1s和3s周期对LED进行点亮—熄灭的…...
【c语言】qsort函数及泛型冒泡排序的模拟实现
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C语言 目录 一、qsort函数 1.回调函数 2.qsort函数 3.void* 指针 二、泛型冒泡排序的模拟实现 1.比较函数的编写 2.交换函数的编写 3.冒泡排序的编写 4…...
MySQL之多表查询—表子查询
一、引言 上一篇博客学习了行子查询。(看弹幕:同一张表用or,不同张表用union) 下面接着学习子查询当中的最后一种——表子查询。 表子查询 1、概念 子查询返回的结果是多行多列,这种子查询称为表子查询。 2、常用的操作符 IN 3、…...
Java 18风暴来袭:解锁编程新纪元
一、引言 Java 18的发布标志着Java语言在性能、安全性和开发效率方面的又一次飞跃。本次更新不仅带来了新的语言特性,还包括了一些实验性功能和工具的改进。这些新特性旨在帮助开发者编写更高效、更安全的代码,并提升开发体验。 二、新特性概述 1. 默…...
文件操作(Python和C++版)
一、C版 程序运行时产生的数据都属于临时数据,程序—旦运行结束都会被释放通过文件可以将数据持久化 C中对文件操作需要包含头文件< fstream > 文件类型分为两种: 1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中 2. 二进制文件- 文件以文本的二进…...
Git【版本控制命令】
02 【本地库操作】 1.git的结构 2.Git 远程库——代码托管中心 2.1 git工作流程 代码托管中心用于维护 Git 的远程库。包括在局域网环境下搭建的 GitLab 服务器,以及在外网环境下的 GitHub 和 Gitee (码云)。 一般工作流程如下: 1.从远程…...
打字侠是一款PWA网站,如何下载到电脑桌面?
嘿,亲爱的键盘侠们! 你是否还在为寻找一款好用的打字练习工具而烦恼?别担心,今天我要给大家介绍一位超级英雄——打字侠!它不仅是一个超级酷的打字练习网站,还是一款PWA(渐进式网页应用&#x…...
Scikit-learn使用步骤?使用场景?
Scikit-learn(简称sklearn)是Python中一个非常流行的机器学习库,它提供了广泛的机器学习算法和工具,用于数据分析、特征工程、模型训练、模型评估等任务。以下是一个关于sklearn的基础教程,内容将按照几个主要部分进行…...
MySQL 5.7详细下载安装配置教程(MySQL 5.7安装包)_mysql5.7的安装教程
记录MySQL 5.7 的下载安装教程,并提供了Mysql 安装包 ,以下是详细下载安装过程。 一、下载Mysql安装包 网盘下载: 下载MySQL 5.7安装包,网盘下载地址:点击此处直接下载 官网下载: 进入官网,…...
电阻十大品牌供应商
选型时选择热门的电阻品牌,主要是产品丰富,需求基本都能满足。 所所有的电路中,基本没有不用电阻的,电阻的选型需要参考阻值、精度、封装、温度范围,贴片/插件等参数,优秀的供应商如下: 十大电…...
三维任意形状随机骨料matlab生成:基于映射网格的属性赋予方法
三维任意形状随机骨料matlab生成,基于映射网格(背景网格法)进行骨料、砂浆、界面属性的赋予。在混凝土材料细观建模中,生成真实的三维骨料结构是个技术活。今天咱们就来聊聊如何用Matlab造出形状各异的随机骨料,再通过…...
Redis知识点完整补充文档
再学习该文档的时候先学习Redis内容 https://blog.csdn.net/MC_sir/article/details/159394860?spm1001.2014.3001.5502https://blog.csdn.net/MC_sir/article/details/159394860?spm1001.2014.3001.5502 一、基础定义与存储结构(补充) 1. 五大数据结…...
DeepSeek-VL2微调报错“AssertionError”终极解决:修改config.json里的topk_method参数
DeepSeek-VL2微调报错"AssertionError"终极解决方案:深入解析topk_method参数 当你满怀期待地准备微调DeepSeek-VL2这个强大的多模态大模型时,却在训练启动阶段遭遇了令人沮丧的"AssertionError"和"assert not self.training&q…...
go logrus和zap各有什么优缺点
Go 生态中两个最流行的结构化日志库对比:Logrus vs Zap 对比 特性 Logrus Zap 性能 较慢(反射-based) 极快(零分配、结构化) API 风格 链式调用,类似 Python logging 显式字段࿰…...
Video2X:用AI突破视频质量瓶颈的全栈解决方案
Video2X:用AI突破视频质量瓶颈的全栈解决方案 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/video…...
哔哩下载姬downkyi:零基础到专业级的B站视频高效管理指南
哔哩下载姬downkyi:零基础到专业级的B站视频高效管理指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&am…...
遇到复杂车线桥耦合分析总被建模效率卡脖子?试试Simpack+Abaqus/ANSYS这套组合拳,咱们直接上干货聊聊那些提效黑科技
simpack abaqus ansys车线桥耦合高效建模分析工具 1.快速生成非线性柔性轨节点处mark 2.桥梁纵向轨底处的对应的mark及坐标 3.快速建立力元并设置preload方向 4.免安装运行环境点击exe输入 5.基于ansys或者abaqus和simpack联合仿真的5跨、3跨简支梁车线桥耦合分析实例轨节点标记…...
OpenClaw多模型调度方案:GLM-4.7-Flash与本地小模型协同工作
OpenClaw多模型调度方案:GLM-4.7-Flash与本地小模型协同工作 1. 为什么需要多模型协同 去年冬天,当我第一次尝试用OpenClaw自动化处理周报时,发现一个尴尬的现象:用GLM-4.7-Flash这样的大模型处理简单表格整理,就像用…...
力扣994. 腐烂的橘子
题目:腐烂的橘子https://leetcode.cn/problems/rotting-oranges/description/在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 0 代表空单元格;1 代表新鲜橘子;2 代表腐烂的橘子。 每分钟,腐…...
视频抠像技术全解析:基于MatAnyone的动态场景处理与多目标分离方案
视频抠像技术全解析:基于MatAnyone的动态场景处理与多目标分离方案 【免费下载链接】MatAnyone MatAnyone: Stable Video Matting with Consistent Memory Propagation 项目地址: https://gitcode.com/gh_mirrors/ma/MatAnyone 视频抠像技术在影视制作、直播…...
