C++中全局变量和局部变量的区别

C++中全局变量和局部变量的区别

在C++(以及其他编程语言)中,变量的作用域和生命周期是两个非常重要的概念。全局变量和局部变量在作用域和生命周期上有显著的区别。下面我将详细讲解全局变量和局部变量的区别,并通过代码示例来帮助理解。


一、全局变量

定义

全局变量是在函数外部定义的变量,它们的作用域从定义处开始,直到程序结束。全局变量在整个程序中都可以访问,除非被局部变量遮蔽。

生命周期

全局变量的生命周期从程序启动开始,直到程序结束。它们在程序的整个运行期间都存在。

存储位置

全局变量存储在全局数据区(Global Data Segment)中。

代码示例

#include <iostream>
using namespace std;// 全局变量
int globalVar = 10;void printGlobalVar() {cout << "Global variable: " << globalVar << endl;
}int main() {printGlobalVar(); // 访问全局变量globalVar = 20;   // 修改全局变量printGlobalVar(); // 再次访问全局变量return 0;
}

输出

Global variable: 10
Global variable: 20

二、局部变量

定义

局部变量是在函数内部定义的变量,它们的作用域仅限于定义它们的函数。局部变量在函数调用时创建,在函数返回时销毁。

生命周期

局部变量的生命周期仅限于函数调用期间。每次函数调用时,局部变量都会被重新创建,函数返回时局部变量会被销毁。

存储位置

局部变量通常存储在栈(Stack)中。

代码示例

#include <iostream>
using namespace std;void printLocalVar() {int localVar = 10; // 局部变量cout << "Local variable: " << localVar << endl;
}int main() {printLocalVar(); // 访问局部变量// localVar = 20; // 错误:局部变量在函数外部不可访问return 0;
}

输出

Local variable: 10

三、全局变量和局部变量的区别

作用域

  • 全局变量:从定义处开始,直到程序结束,整个程序都可以访问。
  • 局部变量:仅在定义它们的函数内部有效,函数外部无法访问。

生命周期

  • 全局变量:从程序启动到程序结束,整个运行期间都存在。
  • 局部变量:仅在函数调用期间存在,函数返回时被销毁。

存储位置

  • 全局变量:存储在全局数据区。
  • 局部变量:存储在栈中。

初始化

  • 全局变量:如果未显式初始化,会被自动初始化为0。
  • 局部变量:如果未显式初始化,其值是未定义的(垃圾值)。

代码示例

#include <iostream>
using namespace std;// 全局变量
int globalVar;void printGlobalVar() {cout << "Global variable (initially): " << globalVar << endl;globalVar = 10; // 修改全局变量cout << "Global variable (after modification): " << globalVar << endl;
}void printLocalVar() {int localVar; // 未初始化,值是未定义的cout << "Local variable (uninitialized): " << localVar << endl;localVar = 20; // 初始化局部变量cout << "Local variable (initialized): " << localVar << endl;
}int main() {printGlobalVar(); // 访问和修改全局变量printLocalVar();  // 访问和初始化局部变量return 0;
}

输出

Global variable (initially): 0
Global variable (after modification): 10
Local variable (uninitialized): [垃圾值]
Local variable (initialized): 20

四、注意事项

  1. 变量遮蔽(Shadowing)

    • 如果局部变量与全局变量同名,局部变量会遮蔽全局变量。在函数内部,访问的将是局部变量。
    • 如果需要访问被遮蔽的全局变量,可以使用 :: 作用域解析运算符。
    • 代码示例
      #include <iostream>
      using namespace std;int globalVar = 10;void printVar() {int localVar = 20; // 局部变量cout << "Local variable: " << localVar << endl;cout << "Global variable: " << ::globalVar << endl; // 使用 :: 访问全局变量
      }int main() {printVar();return 0;
      }
      
      输出
      Local variable: 20
      Global variable: 10
      
  2. 全局变量的使用

    • 全局变量虽然方便,但过度使用会导致代码难以维护和调试。尽量减少全局变量的使用,优先使用局部变量和函数参数传递数据。
  3. 局部变量的初始化

    • 始终初始化局部变量,避免使用未初始化的变量,这可能会导致未定义行为。

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

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

相关文章

基于RPA技术的ECRobot企业智能体解决方案,打通企业自动化业务流程的最后一公里

在企业的日常运营中&#xff0c;难免会遇到一些繁琐且重复的任务&#xff0c;这类高频次、低复杂度的事务性工作往往造成人力资源和成本的浪费。因此如何通过智能化工具实现流程自动化&#xff0c;已经成为企业数字化转型进程中的共性课题。 RPA技术&#xff1a;自动化赋能企业…

ipv6与p2p的关系

在PCDN&#xff08;P2P内容分发网络&#xff09;领域&#xff0c;IPv6与PCDN盒子的关系紧密且相互影响&#xff0c;主要体现在以下几个方面&#xff1a; 一、IPv6的部署推动PCDN盒子普及 地址资源充足 IPv6采用128位地址&#xff0c;解决了IPv4地址枯竭的问题&#xff0c;为PC…

大模型应用开发之预训练

预训练是研发大语言模型的第一个训练阶段&#xff0c;通过在大规模语料上进行预训练&#xff0c;大语言模型可以获得通用的语言理解与生成能力&#xff0c;掌握较为广泛的世界知识&#xff0c;具备解决众多下游任务的性能潜力 一、数据预处理 1. 数据的收集 1&#xff09;通…

[python]Prophet‘ object has no attribute ‘stan_backend‘解决方法

测试环境&#xff1a; prophet1.1.4 写代码&#xff1a; from prophet import Prophet modelProphet() print(123) 在anaconda prompt里面没有报错&#xff0c;但是打开jupyter notebook会报错Prophet object has no attribute stan_backend&#xff0c;据此猜测jupyter应该…

【HTML】基础学习【数据分析全栈攻略:爬虫+处理+可视化+报告】

- 第 102 篇 - Date: 2025 - 05 - 31 Author: 郑龙浩/仟墨 文章目录 HTML 基础学习一 了解HTML二 HTML的结构三 HTML标签1 标题2 文本段落3 换行4 加粗、斜体、下划线5 插入图片6 添加链接7 容器8 列表9 表格10 class类 HTML 基础学习 一 了解HTML 一个网页分为为三部分&…

ansible中的inventory.ini 文件详解

1. 主机定义 主机是 Ansible 管理的最小单元&#xff0c;可以是 IP 或域名&#xff0c;支持直接定义或附加参数。 基础语法 # 直接定义主机&#xff08;IP 或域名&#xff09; 192.168.1.10 example.com# 定义主机并指定连接参数&#xff08;如端口、用户等&#xff09; web…

SpringBoot整合MyBatis完整实践指南

在Java企业级应用开发中&#xff0c;SpringBoot和MyBatis的组合已经成为主流的技术选型方案之一。本文将详细介绍如何从零开始搭建一个基于SpringBoot和MyBatis的项目&#xff0c;包括环境配置、数据库设计、实体类创建、Mapper接口编写以及实际应用等完整流程。 一、环境准备…

【Rust 轻松构建轻量级多端桌面应用】

使用 Tauri 框架构建跨平台应用 Tauri 是一个基于 Rust 的轻量级框架&#xff0c;可替代 Electron&#xff0c;用于构建高性能、低资源占用的桌面应用。其核心优势在于利用系统原生 WebView 而非捆绑 Chromium&#xff0c;显著减小应用体积。 安装 Tauri 需要先配置 Rust 环境…

【Linux】shell脚本的常用命令

目录 简介 一.设置主机名称 1.1通过文件修改 1.2通过命令修改 二.网络管理命令nmcli 2.1查看网卡 2.2设置网卡 三.简单处理字符 3.1seq打印连续字符 3.2printf,echo打印字符 3.3sort排序 3.4uniq冗余处理 3.5cut对字符的截取 四.xargs输入转参 简介 以下命令都是…

解决访问网站提示“405 很抱歉,由于您访问的URL有可能对网站造成安全威胁,您的访问被阻断”问题

一、问题描述 本来前几天都可以正常访问的网站&#xff0c;但是今天当我们访问网站的时候会显示“405 很抱歉&#xff0c;由于您访问的URL有可能对网站造成安全威胁&#xff0c;您的访问被阻断。您的请求ID是&#xff1a;XXXX”&#xff0c;而不能正常的访问网站&#xff0c;如…

页面输入数据的表格字段(如 Web 表单或表格控件)与后台数据库进行交互时常用的两种方式

“从页面输入数据的表格字段(如 Web 表单或表格控件)在与后台数据库进行交互时,常用的有两种方式:” 🎯 两种方式(操作调用数据库、绑定数据) 🚀 方式1:前端代码提交数据到后端,再由后端调用数据库 💡 原理和逻辑: 用户在页面上(比如输入表单、表格)输入数据…

非阻塞套接字编程详解

阻塞与非阻塞套接字对比 传统阻塞式套接字编程使用ServerSocket和Socket类时,关键方法如connect()、accept()、read()、write()都会导致调用线程阻塞,直到操作完成。这种模式存在两个主要问题: 客户端线程在等待数据时会被完全阻塞服务端需要为每个客户端连接创建独立线程,…

电子电路:初步认识CMOS技术

CMOS&#xff08;Complementary Metal-Oxide-Semiconductor&#xff0c;互补金属氧化物半导体&#xff09;是一种半导体技术&#xff0c;广泛应用于集成电路&#xff08;IC&#xff09;的设计和制造中。以下是关于CMOS的详细说明&#xff1a; 1. 基本概念 技术原理&#xff1a…

【11408学习记录】考研英语写作提分秘籍:2013真题邀请信精讲+万能模板套用技巧

邀请信 英语写作2013年考研英语&#xff08;一&#xff09;真题小作文题目分析写作思路第一段&#xff1a;第二段&#xff1a;锦囊妙句1&#xff1a;锦囊妙句2&#xff1a;锦囊妙句3&#xff1a;锦囊妙句5&#xff1a;锦囊妙句6&#xff1a;锦囊妙句9&#xff1a;锦囊妙句14&am…

Java 注解与反射(超详细!!!)

Java 注解与反射&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09; 文章目录 Java 注解与反射&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09;1.注解1.1内置注解1.1.1 SuppressWarnings注解用法 1.2 元注解1.3自定义注解 2.反射2.1 反…

用nz-tabel写一个合并表格

用nz-tabel写一个合并表格 <nz-table #basicTable [nzData]"tableSearchStatus.dataList" nzBordered><thead><tr><th>班级</th><th>姓名</th><th>年龄</th><th>电话</th></tr></thead&…

第6章 放大电路的反馈

本章基本要求 会判&#xff1a;判断电路中有无反馈及反馈的性质 会算&#xff1a;估算深度负反馈条件下的放大倍数 会引&#xff1a;根据需求引入合适的反馈 会判振消振&#xff1a;判断电路是否能稳定工作&#xff0c;会消除自激振荡。 6.1 反馈的概念及判断 一、反馈的…

ansible template 文件中如果包含{{}} 等非ansible 变量处理

在 Ansible 模板中&#xff0c;如果你的 Python 脚本里有大量 {}、f""、或者其他 Jinja 会误解析的语法&#xff0c;就需要用 {% raw %}…{% endraw %} 把它们包起来&#xff0c;只在需要替换变量的那一行单独“放行”。例如&#xff1a; {% raw %} #!/usr/bin/env …

STM32G4 电机外设篇(一) GPIO+UART

目录 一、STM32G4 电机外设篇&#xff08;一&#xff09; GPIOUART1 GPIO1.1 STM32CUBEMX 配置以及Keil代码1.2 代码和实验现象 2 UART2.1 STM32CUBEMX 配置以及Keil代码2.2 代码和实验现象 附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^) 一、STM32G4 电机外设篇&#xff0…

Kotlin 中集合遍历有哪几种方式?

1 for-in 循环&#xff08;最常用&#xff09; val list listOf("A", "B", "C") for (item in list) {print("$item ") }// A B C 2 forEach 高阶函数 val list listOf("A", "B", "C") list.forEac…