当前位置: 首页 > news >正文

11. C 语言 作用域与变量使用技巧

本章目录:

    • 前言
    • 一、作用域的分类
      • 局部变量
        • 示例:
      • 全局变量
        • 示例:
        • 示例:
      • 形式参数
        • 示例:
    • 二、作用域的细节与常见误区
      • 块级作用域
        • 示例:
      • 静态变量与全局变量的对比
        • 示例:
      • 未初始化变量的影响
        • 示例:
    • 三、实参与形参:数据传递的机制
        • 示例:
    • 四、最佳实践与总结


前言

在 C 语言编程中,作用域是一个核心概念,它决定了变量的生命周期和可访问性。理解作用域不仅能帮助我们更高效地管理代码,还能避免常见的编程错误。本文将通过理论与实践结合,详细解析作用域的分类、使用场景及注意事项。


一、作用域的分类

C 语言中变量可以根据声明的位置划分为以下三种类型:

  1. 局部变量:在函数或代码块内声明,只在声明它的代码块中可见。
  2. 全局变量:在所有函数外部声明,在整个程序中可见。
  3. 形式参数:函数的参数,作用于函数内部,类似局部变量。

局部变量

局部变量只能在声明它的函数或代码块内使用,函数外部无法访问。这种限制能避免命名冲突,提高代码的安全性和可维护性。

示例:
#include <stdio.h>int main() {int a = 10, b = 20; // 局部变量int c = a + b;      // 计算局部变量的和printf("a = %d, b = %d, c = %d\n", a, b, c);return 0;
}

特点

  • 生命周期:局部变量在所在的函数或代码块调用结束后自动销毁。
  • 内存位置:存储在栈中,动态分配。

全局变量

全局变量声明在所有函数外部,默认初始化为类型的零值(如 int 类型初始化为 0)。它可以在程序的任何位置访问。

示例:
#include <stdio.h>int g; // 全局变量int main() {int a = 10, b = 20;g = a + b; // 访问全局变量printf("a = %d, b = %d, g = %d\n", a, b, g);return 0;
}

注意事项

  • 命名冲突:如果局部变量与全局变量同名,函数内优先使用局部变量。
  • 存储位置:全局变量保存在静态存储区,占用固定内存空间。
示例:
#include <stdio.h>int g = 20; // 全局变量int main() {int g = 10; // 局部变量,屏蔽全局变量printf("g = %d\n", g); // 输出局部变量值return 0;
}

输出:

g = 10

形式参数

形式参数是函数声明中的变量,它们是局部变量的一种特殊形式,只有在函数调用时分配内存。

示例:
#include <stdio.h>int sum(int a, int b); // 函数声明int main() {int a = 10, b = 20;printf("Sum = %d\n", sum(a, b)); // 实参传递给形参return 0;
}int sum(int a, int b) { // 形参声明return a + b;
}

特点

  • 内存分配:函数调用时分配,调用结束时释放。
  • 传递方式:按值传递,形参是实参的拷贝,不影响实参值。

二、作用域的细节与常见误区

块级作用域

在 C 语言中,ifforwhile 等控制结构内部定义的变量只在对应块内有效。

示例:
#include <stdio.h>int main() {if (1) {int a = 5; // 块级变量}// printf("%d", a); // 错误:a 超出作用域return 0;
}

静态变量与全局变量的对比

静态变量在局部作用域内定义,但生命周期与全局变量相同,且仅在声明的作用域内可见。

示例:
#include <stdio.h>void countCalls() {static int count = 0; // 静态变量count++;printf("Function called %d times\n", count);
}int main() {countCalls();countCalls();return 0;
}

输出:

Function called 1 times
Function called 2 times

未初始化变量的影响

  • 局部变量在未初始化时会保留内存中的垃圾值,可能导致不可预测的行为。
  • 全局变量默认初始化为零值。
示例:
#include <stdio.h>int g; // 默认初始化为 0int main() {int a; // 未初始化,值不确定printf("g = %d, a = %d\n", g, a); // a 可能输出垃圾值return 0;
}

三、实参与形参:数据传递的机制

在函数调用中,实参形参的关系可以总结为以下几点:

  1. 按值传递:实参的值传递给形参,形参的修改不会影响实参。
  2. 生命周期:形参在函数调用时分配,调用结束后释放。
示例:
#include <stdio.h>int addOne(int x) {x++; // 形参修改不影响实参return x;
}int main() {int a = 5;printf("Before: %d\n", a);printf("Result: %d\n", addOne(a));printf("After: %d\n", a); // 实参未受影响return 0;
}

输出:

Before: 5
Result: 6
After: 5

四、最佳实践与总结

  1. 优先使用局部变量:局部变量能减少全局命名冲突,提高代码的可读性。
  2. 正确初始化变量:未初始化的局部变量可能导致不可预测的行为。
  3. 合理使用全局变量:避免全局变量过多,导致程序难以维护。
  4. 理解作用域规则:块级作用域限制变量范围,防止误用。

通过理解作用域规则和变量使用技巧,我们可以编写出更加健壮、高效的 C 语言程序!


相关文章:

11. C 语言 作用域与变量使用技巧

本章目录: 前言一、作用域的分类局部变量示例&#xff1a; 全局变量示例&#xff1a;示例&#xff1a; 形式参数示例&#xff1a; 二、作用域的细节与常见误区块级作用域示例&#xff1a; 静态变量与全局变量的对比示例&#xff1a; 未初始化变量的影响示例&#xff1a; 三、实…...

【机器学习案列】学生抑郁可视化及预测分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

Perl语言的循环实现

Perl语言的循环实现 引言 Perl是一种强大的脚本语言&#xff0c;以其灵活的语法和强大的文本处理能力著称。无论是在系统管理、网络编程&#xff0c;还是在Web应用开发中&#xff0c;Perl都广泛应用于各种领域。循环是编程语言中一个极其重要的概念&#xff0c;它允许程序重复…...

SpringBoot项目——使用Spark对爬虫爬取下的数据进行清洗

随着互联网信息呈爆炸式增长&#xff0c;爬虫技术被广泛用于从海量网页中抓取有价值的数据。然而&#xff0c;爬取到的数据往往存在格式不规范、重复、噪声等诸多问题&#xff0c;需要高效的数据清洗流程来保障数据质量&#xff0c;Spark 在其中发挥了关键作用。 什么是Spark …...

分布式锁 Redis vs etcd

为什么要实现分布式锁?为什么需要分布式锁,分布式锁的作用是什么,哪些场景会使用到分布式锁?分布式锁的实现方式有哪些分布式锁的核心原理是什么 如何实现分布式锁redis(自旋锁版本)etcd 的分布式锁(互斥锁(信号控制)版本) 分布式锁对比redis vs etcd 总结 为什么要实现分布式…...

《深度剖析:开源与闭源模型,AI舞台上的不同角色》

在人工智能蓬勃发展的当下&#xff0c;模型的选择如同为一场战役挑选合适的武器&#xff0c;至关重要。开源模型与闭源模型作为AI领域的两大阵营&#xff0c;在性能和应用场景上展现出显著差异&#xff0c;深刻影响着开发者、企业以及整个行业的走向。 性能差异&#xff1a;实…...

Angular结合C#

在 Angular 2 及以上版本与 C#结合使用 REST API 的示例中&#xff0c;我们将分别展示前端 Angular 服务和后端 C# Web API 的实现。 一、前端&#xff1a;Angular 服务 生成 Angular 服务 使用 Angular CLI 生成一个新的服务&#xff0c;例如user.service.ts&#xff1a; ng…...

Spring——自动装配

假设一个场景&#xff1a; 一个人&#xff08;Person&#xff09;有一条狗&#xff08;Dog&#xff09;和一只猫(Cat)&#xff0c;狗和猫都会叫&#xff0c;狗叫是“汪汪”&#xff0c;猫叫是“喵喵”&#xff0c;同时人还有一个自己的名字。 将上述场景 抽象出三个实体类&…...

Servlet与JSP:Java的秘密花园入口

1 Servlet概述 Servlet是Java Web应用中的一个核心组件&#xff0c;它是一个运行在服务器端的Java程序&#xff0c;可以响应客户端的请求并生成响应。Servlet为Web应用提供了一个统一的接口来处理HTTP请求。 2 Servlet的生命周期 Servlet的生命周期包括以下几个阶段&#xff…...

【Linux】Linux常见指令(上)

个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统&#xff0c;Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…...

ELFK日志采集实战

一、日志分析概述 日志分析是运维工程师解决系统故障&#xff0c;发现问题的主要手段 日志主要包括系统日志、应用程序日志和安全日志 系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因 经常分析日志可以了解服务器的负荷&#x…...

Kubernetes 使用自定义资源(CRD)扩展API

K8s CRD 即 Kubernetes CustomResourceDefinition&#xff0c;是 Kubernetes 提供的一种扩展机制&#xff0c;允许用户在 Kubernetes 集群中定义和使用自定义的资源类型。通过定义 CRD&#xff0c;用户可以在 Kubernetes 集群中创建、读取、更新和删除自定义资源对象&#xff0…...

用户使用LLM模型都在干什么?

Anthropic 对用户与 Claude 3.5 Sonnet 的大量匿名对话展开分析&#xff0c;主要发现及相关情况如下&#xff1a; 使用用途分布 软件开发主导&#xff1a;在各类使用场景中&#xff0c;软件开发占比最高&#xff0c;其中编码占 Claude 对话的 15% - 25%&#xff0c;网页和移动应…...

MySQL常用命令之汇总(Summary of Commonly Used Commands in MySQL)

MySQL常用命令汇总 简介 ‌MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;现属于Oracle公司。‌ MySQL支持SQL&#xff08;结构化查询语言&#xff09;&#xff0c;这是数据库操作的标准语言&#xff0c;用户可以使用SQL进…...

六年之约day10

今日开心∶今天部门开了个颁奖大会&#xff0c;看着别人收获的荣誉&#xff0c;还真有些羡慕&#xff0c;什么时候&#xff0c;我也能拥有属于自己的荣誉啊. 今日不开心∶活没干多少&#xff0c;对业务也不是很懂 今日思考∶很多事情&#xff0c;存在即合理.工作&#xff0c;…...

springboot和vue配置https请求

项目场景&#xff1a; 代码发布到线上使用https请求需要配置ssl证书&#xff0c;前后端都需要修改。 问题描述 如图&#xff0c;我们在调用接口时报如下错误&#xff0c;这就是未配置ssl但是用https请求产生的问题。 解决方案&#xff1a; 前端&#xff1a;在vite.config.js文…...

selenium遇见伪元素该如何处理?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 问题发生 在很多前端页面中&#xff0c;大家会见到很多&#xff1a;:before、::after 元素&#xff0c;比如【百度流量研究院】&#xff1a; 比如【百度疫情大数…...

慧集通(DataLinkX)iPaaS集成平台-数据质量

1.什么是数据质量 介绍&#xff1a; 数据质量的主要作用就是记录组件写入的数据&#xff0c;及执行时的相关信息&#xff0c;如执行的最终状态&#xff08;成功&#xff0c;失败&#xff0c;进行中等&#xff09;&#xff0c;执行的时间&#xff08;创建时间&#xff0c;修改时…...

微软发布AIOpsLab:一个开源的全面AI框架,用于AIOps代理

在当今这个云计算技术迅猛发展的时代&#xff0c;企业面临着前所未有的挑战与机遇。随着云基础设施的日益复杂化&#xff0c;它们成为了企业运营不可或缺的支柱。网站可靠性工程师&#xff08;Site Reliability Engineers&#xff0c;简称SRE&#xff09;和DevOps团队肩负着关键…...

ElasticSearch | Elasticsearch与Kibana页面查询语句实践

关注&#xff1a;CodingTechWork 引言 在当今大数据应用中&#xff0c;Elasticsearch&#xff08;简称 ES&#xff09;以其高效的全文检索、分布式处理能力和灵活的查询语法&#xff0c;广泛应用于各类日志分析、用户行为分析以及实时数据查询等场景。通过 ES&#xff0c;用户…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...