C++編程學習(第19天)

局部變量和全局變量

每一個變量都有其有效作用范圍,這就是變量的作用域,在作用域以外是不能訪問這些變量的。

局部變量

在一個函數內部定義的變量是局部變量,它只在本函數范圍內有效,也就是說只有在本函數內才能使用他們,在此函數以外是不能使用這些變量的。

同樣,在復合語句中定義的變量只在本復合語句范圍內有效,這些內部變量稱為局部變量。

需要注意的是

1、主函數main中定義的變量也只在主函數中有效,不會因為在主函數中定義而在整個文件或程序中有效,在主函數中也不能使用其它函數中定義的變量。

2、不同函數中可以使用同名變量,他們代表不同的對象,互不干擾。

3、可以在一個函數內的復合語句中定義變量,這些變量只在本復合語句中有效,這種復合語句也稱為分程序或程序塊。

4、形式參數也是局部變量。

5、在函數原型中出現的參數名,并不是實際存在的變量,不能被引用,編譯系統對函數聲明中的參數名是忽略的,即使在調用函數時也沒有為他們分配存儲單元。

全局變量

在函數內部定義的變量是局部變量,而在函數外部定義的變量是外部變量,也稱全局變量。全局變量的有效范圍為從定義變量的位置開始到本源文件結束。

在一個函數中既可以使用本函數中定義的局部變量,又可以使用有效的全局變量。

需要注意的是

1、全局變量的作用是增加了函數間數據聯系的渠道。由于同一文件中的所有函數都能使用全局變量的值,因此如果在一個函數中改變了全局變量的值,就能影響到其它函數,使其它函數中的同名變量的值也同時改變,這相當于各個函數間有直接的傳遞通道。由于函數的調用只能帶回一個返回值,因此有時可以利用全局變量增加函數間數據傳遞的渠道。

2、不必要時不要使用全局變量。因為全局變量在程序的全部執行過程中都占用存儲單元,而不是僅在需要時才開辟單元。全局變量使函數的通用性降低了,因為在執行函數時要受到外部變量的影響。如果將一個函數移到另一個文件中,還要將有關的外部變量及其值一起移過去,若該外部變量與其它文件的變量同名,就會出現問題,降低了程序的可靠性和通用性。

在程序設計中,在劃分模塊時要求模塊的內聚性強、與其它模塊的耦合性弱,即模塊的功能要單一,與其它模塊的相互影響要盡量少。

一般要求把程序中的函數做成一個封閉體,除了可以通過實參-形參的渠道與外界發生聯系外,沒有其它渠道,這樣的程序移植性好,可讀性強。

使用全局變量過多,會降低程序的清晰性,人們往往難以清楚地判斷出每個瞬間各個全局變量的值。在各個函數執行時都可能改變全局變量的值,程序容易出錯。

3、如果在同一個源文件中,全局變量與局部變量同名,則在局部變量的作用范圍內,全局變量被屏蔽,會不起作用,此時可以使用局部變量。

4、變量的有效范圍稱為變量的作用域。變量有四種不同的作用域,分為文件作用域、函數作用域、塊作用域和函數原型作用域。文件作用域是全局的,其它作用域是局部的。

變量的聲明和定義

對變量而言,在聲明部分出現的變量有兩種情況,一種是需要建立存儲空間的,如int a;,稱為定義性聲明,或稱為定義。另一種是不需要建立存儲空間的,如extern int a;,稱為引用性聲明。

廣義來講,聲明包括定義,但并非所有的聲明都是定義。一般為了敘述方便,把建立存儲空間的聲明稱為定義,把不需要建立存儲空間的聲明稱為聲明。這里指的聲明是狹義的,即非定義性聲明。

外部變量定義和外部變量聲明是不同的。外部變量的定義只能有一次,它的位置在所有函數之外,而同一文件中的外部變量的聲明可以有多次,它的位置可以在函數之內,也可以在函數之外。系統根據外部變量的定義分配存儲單元。對外部變量的初始化只能在定義時進行,而不能在聲明時進行。

所謂聲明,其作用是向編譯系統發出一個信息,聲明該變量是一個在后面定義的外部變量,僅僅是為了提前引用該變量而作的聲明。

需要注意的是,使用auto,register,static聲明變量時,是在定義變量的基礎上加上這些關鍵字,而不能單獨使用。

內部函數和外部函數

函數本質上是全局的,因為一個函數要被另外的函數調用,但是也可以指定函數只能被本文件調用,而不能被其它文件調用。根據函數能否被其它源文件調用,將函數區分為內部函數和外部函數。

內部函數

如果一個函數只能被本文件中其它函數所調用,則稱為內部函數。

在定義內部函數時,在函數名和函數類型的前面加static。

函數首部的一般格式為

static 類型標識符 函數名(形參表)

內部函數又稱靜態函數,使用內部函數,可以使函數只局限于所在文件。如果在不同的文件中有同名的內部函數,互不干擾。這樣不同的人可以分別編寫不同的函數,而不必擔心所有函數名是否會與其它文件中的函數相同。通常把只能由同一文件使用的函數和外部變量放在一個文件中,在它們之前都冠以static使之局部化,其它文件不能引用。

外部函數

1、在定義函數時,如果在函數首部的左端冠以關鍵字extern,則表示此函數是外部函數,可供其它文件調用。如果在定義函數時省略extern,則默認為外部函數。

2、在需要調用此函數的文件中,用extern聲明所用的函數是外部函數。

使用extern聲明就能夠在一個文件中調用其它文件中定義的函數,或者說把該函數的作用域擴展到本文件。

extern聲明的形式就是在函數原型基礎上加關鍵字extern。由于函數在本質上是外部的,在程序中經常要調用其它文件中的外部函數,為方便編程,C++允許在聲明函數時省寫extern。

用原型函數能夠把函數的作用域擴展到定義該函數的文件之外,只要在使用該函數的每一個文件中包含該函數的函數原型即可。函數原型通知編譯系統,該函數在本文件中稍后定義,或在另一個文件中定義。

頭文件

頭文件的內容

頭文件一般包含:對類型的聲明、函數聲明、內置函數的定義、宏定義、全局變量定義、外部變量聲明或其它頭文件

由于有了#include指令,就可以把不同的文件組合到一起,形成一個文件,因此說,頭文件是源文件之間的接口。

關于C++標準庫和頭文件的形式

新的C++標準庫中的頭文件不再包括后綴.h,但為了使大批已有的C程序能繼續使用,許多C++編譯系統保留了C的頭文件。建議盡量使用符合C++標注的形式。

如果用戶自己編寫頭文件,可以使用.h作后綴,便于區分哪些頭文件使屬于C++標準庫的,哪些頭文件使用戶自編或別人提供的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92192.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92192.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

客流特征識別準確率提升 29%:陌訊多模態融合算法在零售場景的實戰解析

原創聲明本文為原創技術解析文章,涉及的技術參數與架構設計引用自《陌訊技術白皮書》,禁止任何形式的抄襲與轉載。一、行業痛點:零售客流識別的技術瓶頸在零售數字化轉型過程中,客流特征識別(包括性別、年齡分層、停留…

YOLOv8/YOLOv11 C++ OpenCV DNN推理

首先需要將yolov8/yolov11的pt文件轉為onnx文件 from ultralytics import YOLO model YOLO("best.pt") model.export(format"onnx",opset11,dynamicFalse) 本次C工具使用vs2017,需要下載OpenCV包:https://opencv.org/releases/&a…

【Mysql】日志--錯誤日志、二進制日志、查詢日志、慢查詢日志

錯誤日志:數據庫出現錯誤時,進行故障排除默認位置:/var/log/mysqld.log查看日志位置show variables like %log_error%查看日志tail -50 /var/log/mysqld.log二進制日志:記錄了所有的DDL語句和DML語句,不包含查詢(selec…

后端常用框架環境與軟件詳解

一、基礎運行環境 1. JDK(Java Development Kit) 定義:Java 開發工具包,包含編譯器、運行時環境(JRE)及核心類庫 作用:提供 Java 程序開發和運行的基礎環境,是所有 Java 應用的必備依…

本地服務器端部署基于大模型的通用OCR項目——dots.ocr

本地服務器端部署基于大模型的通用OCR項目——dots.ocrdots.ocr相關介紹本地服務器端部署第一步:安裝cuda12.8與CUDNN8.9.7第二步:創建項目所需的依賴環境第三步:啟動項目第四步:測試第五步:文本解析相關性測試第六步&…

Text2SQL 智能問答系統開發-spider驗證集(三)

概述 已完成 基礎 Text2SQL 功能實現 實現用戶輸入自然語言問題后,系統能夠自動生成 SQL 并執行返回結果。用戶交互優化 支持用戶通過補充信息對查詢進行調整,提升易用性。模糊時間處理機制 對“最近”“近期”等模糊時間關鍵詞進行補全或引導&#xf…

ElementUI常用的組件展示

文章目錄1、要使用ElementUI先導入組件庫2、自定義表頭,可以改為添加和批量刪除的按鈕3、Dialog模態框,主要用于添加和修改時展示信息4、抽屜5、消息提示:用于提示是否操作成功6、詢問:常用于詢問是否確定刪除7、批量選擇復選框8、…

在電腦上可以存儲文件并合理備份文件的工具用哪個?

每天被群消息、報表、PPT 輪番轟炸的上班族,最怕的不是加班,而是——文件突然失蹤!別再把“CtrlS”當護身符,今天一口氣測完 4 款熱門“文件保險箱”,看看誰才真正配得上你的 Deadline。 敬業簽 首先登場的是敬業簽&am…

JavaWeb(04)

MyBatis 時一款優秀的持久層框架,用于簡化JDBC的開發 The MyBatis Blog 目錄 MyBatis入門Mybatis基礎CRUDMybatis動態SQL Mybatis入門 快速入門 JDBC介紹 數據庫連接池 lombok 準備工作(創建springboot工程,數據庫表user,實體類User) …

統計學1:伯努利模型的參數估計與等價性分析

伯努利模型的參數估計方法 1. 統計學習方法三要素對比方法模型策略算法極大似然估計概率模型經驗風險最小化數值解貝葉斯估計概率模型結構風險最小化解析解2. 極大似然估計 2.1 模型設定 設P(x1)θP(x1)\thetaP(x1)θ,則P(x0)1?θP(x0)1-\thetaP(x0)1?θ 2.2 似然…

游戲行業DDoS攻防實戰指南

一、游戲DDoS攻擊特征分析游戲行業DDoS攻擊呈現高度復合化特征,攻擊手段日益專業化。2023年Akamai監測數據顯示,63%的游戲服務器攻擊采用UDP反射放大(如NTP、Memcached協議)與HTTP慢速攻擊(如Slowloris)相結…

[自動化Adapt] 錄制引擎 | iframe 穿透 | NTP | AIOSQLite | 數據分片

鏈接:https://github.com/OpenAdaptAI/OpenAdapt/wiki/OpenAdapt-Architecture-(draft) docs:OpenAdapt OpenAdapt 是一個開源項目,旨在 記錄 和 回放 用戶在計算機上的交互行為。 它如同智能助手般 觀察 我們的操作(鼠標點擊、…

ipv6學習

ipv6的歷史背景和及展望ipv6普及不夠,ipv4快要用完。ipv6技術部分ivp6包頭結構ipv6不允許分片,減輕中間設備壓力。IPv6 包頭結構可按字段分層解析,核心特點是 固定頭部長度(40 字節) ,將可選功能移至擴展頭…

軟件定義汽車 --- 電子電氣架構的驅動

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

HTML5 語義元素

HTML5 語義元素 引言 HTML5 作為現代網頁開發的基礎,引入了許多新的語義元素,這些元素使得網頁內容更加結構化,便于搜索引擎更好地理解和索引頁面內容。本文將詳細介紹 HTML5 中的語義元素,并探討其在網頁設計中的應用。 HTML5…

vue3 el-select el-option 使用

在 Vue 3 中,el-select 是 Element Plus 組件庫中的一個選擇器組件,它允許用戶從下拉菜單中選擇一個或多個選項。如果你想在使用 Vue 3 和 Element Plus 時讓 el-select 支持多種選擇(即多選),你可以通過設置 multiple…

windows搬運文件腳本

使用方法:copy_files_by_prefix.bat [目標目錄] [結果目錄] [文件名前綴] [可選參數:文件包含內容]echo off chcp 65001 >nul setlocal enabledelayedexpansion:: Check parameters if "%~3""" (echo Usage: %~nx0 [SourceDir] […

C++ 中 initializer_list 類型推導

在 C 中,initializer_list 是一種用于表示列表初始化的標準庫模板類,提供了一種方便的方式來初始化容器或者進行函數調用時傳遞一組參數。initializer_list&& 類型推導涉及到右值引用和移動語義,這在現代 C 中變得越來越重要。initia…

自動駕駛中的傳感器技術22——Camera(13)

1、可靠性驗證的目標車載攝像頭作為自動駕駛和高級駕駛輔助系統(ADAS)的核心傳感器,其可靠性直接影響到行車安全。可靠性驗證的目標如下:暴露產品缺陷:在研制階段,通過測試發現并修正產品設計中的問題&…

一周學會Matplotlib3 Python 數據可視化-圖形的組成部分

鋒哥原創的Matplotlib3 Python數據可視化視頻教程: 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib,學習Matplotlib圖形參數基本設置&…