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
繁體地址,請注明出處:http://hk.pswp.cn/news/907724.shtml
英文地址,請注明出處:http://en.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…