函數-變量的作用域和生命周期

變量的作用域

引入問題

我們在函數設計的過程中,經常要考慮對于參數的設計,換句話說,我們需要考慮函數需要幾個參數,需要什么類型的參數,但我們并沒有考慮函數是否需要提供參數,如果說函數可以訪問到已定義的數據,則就不需要提供函數形參。

那么我們到底要不要提供函數形參,取決于什么?答案就是變量的作用域(如果函數在變量的作用域范圍內,則函數可以直接訪問數據,無需提供形參)

變量作用域

**概念:**變量的作用范圍,也就是說變量在什么范圍有效。

變量的分類

根據變量的作用域不同,變量可以分為:

  • 全局變量

    說明:定義在函數之外,也稱之為外部變量或者全程變量。

    作用域:從全局變量定義到本源文件結束。

    初始值:整型和浮點型,默認值是0;字符型,默認值是\0;指針型,默認值NULL

    舉例:

     int num1;  // 全局變量,num1能被fun1、fun2、main共同訪問void fun1(){}int num2;  // 全局變量,num2能被fun2、main共同訪問void fun2(){}void main(){}int num3;  // 全局變量,不能被任何函數訪問
    
  • 局部變量

    說明作用域初始值
    形式參數(形參)函數作用域隨機值,需要手動賦初值
    函數內定義的變量函數作用域隨機值,需要手動賦初值
    復合語句中定義的變量塊作用域隨機值,需要手動賦初值
    for循環表達式1定義的變量塊作用域隨機值,需要手動賦初值

    舉例:

     // a,b就是形式參數(局部變量)int add(int a, int b){return a + b;}int add2(int a, int b){// z就是函數內定義的變量(局部變量)int z = a + b;return z;}int list(int arr[], int len){// i就是for循環表達式1的變量(局部變量)for(int i = 0; i < len; i++){// num就是復合語句中定義的變量(局部變量)int num = arr[i];}}
    

    使用全局變量的優缺點

    優點:

    1. 利用全局變量可以實現一個函數對外輸出的多個結果數據。
    2. 利用全局變量可以減少函數形參的個數,從而降低內存消耗,以及因為形參傳遞帶來的時間消耗。

    缺點:

    1. 全局變量在程序的整個運行期間,始終占據內存空間,會引起資源消耗。
    2. 過多的全局變量會引起程序的混亂,操作程序結果錯誤。
    3. 降低程序的通用性,特別是當我們進行函數移植時,不僅僅要移植函數,還要考慮全局變量。
    4. 違反了“高內聚,低耦合”的程序設計原則。

    總結:

    ? 我們發現弊大于利,建議盡量減少對全局變量的使用,函數之間要產生聯系,僅通過實參+形參的方式產生聯系。

作用域舉例

注意:

如果全局變量和局部變量同名,程序執行的時候,就近原則(區分作用域)

 int a = 10;  // 全局變量  全局作用域int main(){int a = 20;  // 局部變量  函數作用域printf("%d\n", a); // 20 就近原則for (int a = 0; a < 5; a++)  // 局部變量 塊作用域{printf("%d", a); // 0 1 2 3 4  就近原則}printf("%d\n",a);  // 20 就近原則}

變量的生命周期

定義

**概念:**變量在程序運行中的存在時間(內存申請到內存釋放的時間)

根據變量存在的時間不同,變量可分為靜態存儲方式動態存儲方式

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

變量的存儲類型

語法:

 變量的完整定義格式: [存儲類型] 數據類型 變量列表;

存儲類型:

  • auto

    auto存儲類型只能修飾局部變量,被auto修飾的局部變量是存儲在動態存儲區(棧區和堆區)的。auto也是局部變量默認的存儲類型。

     int main(){int a;int b;// 以下寫法等價于上面寫法auto int a;auto int b;int a,b;// 以下寫法等價于上面寫法auto int a,b;}
    
  • static

    **修飾局部變量:**局部變量會被存儲在靜態存儲區。局部變量的生命周期被延長。但是作用域不發生改變,不推薦

    **修飾全局變量:**全局變量的生命周期不變,但是作用域衰減,一般限制全局變量只能在本源文件內訪問,其他文件不可訪問。

    **修飾函數:**被static修飾的函數,只能被當前文件訪問,其他引用該文件的文件是無法訪問的,有點類似于java中private

  • extern

    外部存儲類型:只能修飾全局變量,此全局變量可以被其他文件訪問,相當于擴展了全局變量的作用域。

    extern修飾外部變量,往往是外部變量進行聲明,聲明該變量是在外部文件中定義的。起到一個標識作用。函數同理。

    demo01.c

     #include "demo01.h"int fun_a = 10;int fun1(){..}
    

    demo02.c

     #include "demo01.h"// 聲明訪問的外部文件的變量extern int fun_a;// 聲明訪問的外部文件的函數extern int fun1();int fun2();
    
  • register

    寄存器存儲類型:只能修飾局部變量,用register修飾的局部變量會直接存儲到CPU的寄存器中,往往將循環變量設置為寄存器存儲類型(提高讀的效率)

     for (register int i = 0; i < 10; i++){...}
    
static關鍵字的作用
  1. static修飾局部變量,延長其生命周期,但不影響局部變量的作用域。
  2. static修飾全局變量,不影響全局變量的生命周期,會限制全局變量的作用域僅限本文件內使用(私有化);
  3. static修飾函數:此函數就稱為內部函數,僅限本文件內調用(私有化)。static int funa(){..}

內部函數和外部函數

  • 內部函數:使用static修飾的函數,稱作內部函數,內部函數只能在當前文件中調用。
  • 外部函數:使用extern修飾的函數,稱作外部函數,extern是默認的,可以不寫(區分編譯環境),也就是說本質上我們所寫的函數基本上都是外部函數,建議外部函數在被其他文件調用的時候,在其他文件中聲明的時候,加上extern關鍵字,主要是提高代碼的可讀性。

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

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

相關文章

Ansible在配置管理中的應用

Ansible是一個開源的配置管理和應用程序部署工具&#xff0c;它使用YAML語言編寫的Playbook來描述配置和應用部署過程。通過SSH協議與目標機器通信&#xff0c;Ansible可以實現批量操作&#xff0c;極大地提升了工作效率。核心功能Ansible的核心功能包括&#xff1a;配置管理&a…

【學習路線】Go語言云原生開發之路:從簡潔語法到微服務架構

一、Go語言基礎入門&#xff08;1-2個月&#xff09; &#xff08;一&#xff09;環境搭建與工具鏈Go環境安裝 官方安裝&#xff1a;從golang.org下載安裝包版本管理&#xff1a;g、gvm等Go版本管理工具環境變量&#xff1a;GOROOT、GOPATH、GOPROXY配置Go Modules&#xff1a;…

軟件工廠:推動新質生產力的組織躍遷

引言&#xff1a;軟件工廠的建設&#xff0c;不在于工具多&#xff0c;而在于理解深&#xff1b;不在于上線快&#xff0c;而在于體系穩。不僅是“看得見的流水線”&#xff0c;更是“看不見的組織變革”。在新質生產力的時代命題下&#xff0c;軟件工廠正成為連接創新與效率、…

9.0% 年增速驅動!全球自清潔滾輪拖布機器人市場2031年將邁向 946 百萬美元

自清潔滾輪拖布機器人是重要的智能清潔設備&#xff0c;采用滾筒式拖布結構&#xff0c;集掃拖功能&#xff0c;通過高速旋轉加壓擦洗地面&#xff0c;深度除污。其活水清潔系統可實時自清潔、回收污水&#xff0c;避免二次污染&#xff0c;提升清潔效率與效果&#xff0c;帶來…

新能源工廠的可視化碳中和實驗:碳足跡追蹤看板與能源調度策略仿真

摘要新能源工廠明明用著風電、光伏等清潔能源&#xff0c;碳排放數據卻依舊居高不下&#xff1f;某鋰電池廠耗費百萬升級設備&#xff0c;碳足跡卻難以精準追蹤&#xff0c;能源調度全靠經驗“拍腦袋”&#xff0c;導致成本飆升。而隔壁企業通過可視化碳中和實驗&#xff0c;碳…

數據結構自學Day13 -- 快速排序--“非遞歸利用棧實現”

一、快速排序回顧 快速排序本質上是**“分而治之”&#xff08;Divide and Conquer&#xff09;策略的遞歸應用。但遞歸其實就是函數棧的一種體現&#xff0c;因此我們也可以顯式使用棧&#xff08;stack&#xff09;來模擬遞歸過程**&#xff0c;從而實現非遞歸版本的快速排序…

前端數據庫:IndexedDB 基礎使用

前言 在現代 Web 開發中&#xff0c;隨著應用程序復雜度的增加&#xff0c;對本地存儲的需求也越來越高。雖然 localStorage 和 sessionStorage 可以滿足一些簡單的數據存儲需求&#xff0c;但當需要存儲大量結構化數據或進行復雜查詢時&#xff0c;它們就顯得力不從心了。這時…

Kubernetes深度解析:企業級容器編排平臺的核心實踐

引言&#xff1a;Kubernetes的戰略地位與核心價值在云原生技術生態中&#xff0c;??Kubernetes??已成為容器編排的事實標準。根據2023年全球云原生調查報告&#xff1a;全球??96%?? 的組織正在使用或評估Kubernetes企業生產環境Kubernetes采用率增長??400%??&#…

Netty中future和promise用法和區別

定義與概念 Future&#xff1a;表示一個異步操作的結果。它是只讀的&#xff0c;意味著你只能查看操作是否完成、是否成功、獲取結果或者異常等信息&#xff0c;但不能主動設置操作的結果。Promise&#xff1a;是 Future 的可寫擴展。它不僅可以像 Future 一樣查看操作結果&…

微算法科技(NASDAQ:MLGO)采用分布式哈希表優化區塊鏈索引結構,提高區塊鏈檢索效率

隨著區塊鏈技術的快速發展&#xff0c;其在各個領域的應用越來越廣泛。然而&#xff0c;區塊鏈數據的存儲和檢索效率問題一直是制約其發展的瓶頸之一。為了解決這一問題&#xff0c;微算法科技(NASDAQ&#xff1a;MLGO)采用了分布式哈希表&#xff08;DHT&#xff09;技術來優化…

Jmeter的元件使用介紹:(三)配置元件詳解01

Jmeter的配置元件有非常多&#xff0c;常用的有&#xff1a;信息頭管理器、Cookie管理器、用戶定義的變量、Http請求默認值、JDBC Connection Configuration、CSV 數據文件設置、計數器等&#xff0c;本文會對這些常用的配置元件一一介紹&#xff0c;還有其他很多配置元件&…

git 連接GitHub倉庫

一、安裝 git 包在官網下載 git 包二、通過SSH密鑰與GitHub遠程倉庫連接1. 檢查本地 SSH 密鑰是否存在ls -al ~/.ssh如果看到 id_rsa 和 id_rsa.pub&#xff0c;說明已有密鑰。2.如果沒有&#xff0c;生成新的 SSH 密鑰&#xff1a;ssh-keygen -t ed25519 -C "your_email…

如何通過AI掃描代碼中的問題

代碼質量其實在需求高壓&#xff0c;業務快速迭代的場景下往往容易被人忽視的問題&#xff0c;大家的編碼習慣和規范也經常會各有喜好&#xff0c;短期之內獲取看不出來什么問題&#xff0c;但長此以往就會發現&#xff0c;屎山逐步成型了&#xff0c;而線上代碼跑著往往就不想…

Java 大視界 -- Java 大數據機器學習模型在金融衍生品市場波動特征挖掘與交易策略創新中的應用(363)

Java 大視界 -- Java 大數據機器學習模型在金融衍生品市場波動特征挖掘與交易策略創新中的應用&#xff08;363&#xff09;引言&#xff1a;正文&#xff1a;一、Java 構建的金融數據處理架構1.1 多源異構數據實時融合1.2 新聞輿情與市場沖擊建模二、Java 驅動的波動特征挖掘與…

Cartographer安裝測試與模塊開發(三)--Cartographer在Gazebo仿真環境下的建圖以及建圖與定位階段問題(實車也可參考)

參數介紹之所以要首先介紹參數而不是實操&#xff0c;是因為大部分建圖失敗、漂移基本上都是參數設置錯誤引起的&#xff0c;或者說大部分都是TF存在問題&#xff0c;主要是坐標系Frame之間有沖突或者對不上等原因導致的&#xff0c;因此把參數放在前面介紹&#xff0c;了解了參…

uniapp nvue開發App 橫豎屏切換丟失上下文導致 setTimeout和clearTimeout報錯

報錯內容如下 [JS Framework] Failed to find taskCenter (35). [JS Framework] Failed to execute the callback function:TypeError: c.clearTimeout is not a function reportJSException >>>> exception function:__WEEX_CALL_JAVASCRIPT__, exception:JavaSc…

Mirauge3D 賦能:全自動建模,讓城市規劃與建筑設計擁有高分辨率實景三維模型

在數字化浪潮席卷各行各業的當下&#xff0c;高精度、多元化的空間數據已成為基礎測繪、智慧城市建設、自然資源管理等領域高質量發展的核心支撐。從城市交通網絡的智能規劃到國土空間的優化配置&#xff0c;從災害監測的精準預警到生態環境保護的科學決策&#xff0c;空間數據…

Javaweb————學習javaweb的預備知識

??????一.javase,javaweb,javaee的區別和聯系 &#x1f499;&#x1f499;&#x1f499;javase: 通俗的來講就是java技術棧&#xff0c;做java相關開發的基礎&#xff0c;比如javaweb&#xff0c;javaee開發都是必備javase的基礎的&#xff0c;包括java語言基礎&#xff…

zabbix服務自動發現、自動注冊及配置釘釘告警(小白的“升級打怪”成長之路)

目錄 一、自動發現及自動注冊 1、自動發現 2、自動注冊規則 二、監控告警并發送電子郵件 1、設定發郵件的地址 2、設定發郵件的用戶 3、設定監控及觸發的條件 4、開始告警并設置觸發發郵件 三、釘釘告警 1、配置zabbix-server 2、配置監控及觸發 3、web頁面操作 4、…

OSPF多區域

OSPF多區域劃分的必要性 OSPF單區域存在的問題 LSDB 龐大&#xff0c;占用內存大&#xff0c;SPF計算開銷大。 LSA洪泛范圍大&#xff0c;拓撲變化影響范圍大。 路由不能被匯總&#xff0c;路由表龐大&#xff0c;查找路由開銷大 解決辦法 劃分區域可以解決上述問題 每個區域獨…