【時時三省】(C語言基礎)關于變量的聲明和定義

山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省

可能有些人弄不清楚定義與聲明有什么區別,它們是否是一回事。有人認為聲明就是定義,有人認為只有賦了值的才是定義。在C語言的學習中,關于定義與聲明這兩個名詞的使用上始終存在著混淆。不僅許多初學者沒有搞清楚,連不少介紹C語言的教材也沒有給出準確的介紹。

一個函數一般由兩部分組成:聲明部分和執行語句。聲明部分的作用是對有關的標識符(如變量、函數、結構體、共用體等)的屬性進行聲明。對于函數而言,聲明和定義的區別是明顯的,函數的聲明是函數的原型,而函數的定義是對函數功能的定義。對被調用函數的聲明是放在主調函數的聲明部分中的,而函數的定義顯然不在聲明部分的范圍內,它是一個獨立的模塊。

對變量而言,聲明與定義的關系稍微復雜一些。在聲明部分出現的變量有兩種情況:一種是需要建立存儲空間的(如“inta;”),另一種是不需要建立存儲空間的(如“externa ;”)。前者稱為定義性聲明( defining declaration ),或簡稱定義(definition);后者稱為引用性聲明( referencing declaration )。廣義地說,聲明包括定義,但并非所有的聲明都是定義。對“int a;”而言,它既是聲明,又是定義;而對“externa;”而言,它是聲明而不是定義。

一般為了敘述方便,把建立存儲空間的聲明稱定義,而把不需要建立存儲空間的聲明稱為聲明。

顯然這里指的聲明是狹義的,即非定義性聲明。

外部變量定義和外部變量聲明的含義是不同的。外部變量的定義只能有一次,它的位置在所有函數之外。

在同一文件中,可以有多次對同一外部變量的聲明,它的位置可以在函數之內(哪個函數要用就在哪個函數中聲明),也可以在函數之外。系統根據外部變量的定義(而不是根據外部變量的聲明)分配存儲單元。

對外部變量的初始化只能在“定義”時進行,而不能在“聲明”中進行。所謂“聲明”,其作用是聲明該變量是一個已在其他地方已定義的外部變量,僅僅是為了擴展該變量的作用范圍而作的“聲明”。

注意:有一個簡單的結論,在函數中出現的對變量的聲明(除了用extern聲明的以外)都是定義。在函數中對其他函數的聲明不是函數的定義。

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

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

相關文章

Java 時間處理指南:從“踩坑”到“填坑”實戰

🔥「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 場景問題:訂單處理系統的時間計算 假設你正在開發一個電商訂單系統,需要解決以下問題: 用戶下單后,需在…

基于Java的Excel列數據提取工具實現

摘要:本文介紹了一個使用Java語言開發的Excel列數據提取工具,該工具借助Apache POI庫實現對Excel文件的讀取與特定列數據提取功能。通過用戶輸入文件路徑與列名,程序可從指定Excel文件中提取相應列的數據并展示,同時詳細闡述了關鍵…

關于人工智能未來的趨勢

學而不思則罔 翻譯:使用深度學習、強化學習卻不用專家系統,就會產生幻覺。 思而不學則殆 翻譯:只有專家系統邏輯推理,但是不用大模型更新知識,就無法發展下去了。 因此,未來智能的范式應該是: …

Java八股文——MySQL「性能調優篇」

MySQL的EXPLAIN有什么作用? 面試官您好,EXPLAIN命令是我在進行SQL性能優化時,使用最頻繁、也最重要的一個工具。 它的核心作用可以一句話概括:模擬MySQL的查詢優化器來執行一條SQL語句,并向我們展示出它最終決定采用…

win打印機共享處理

win打印機共享處理 軟件鏈接 無法啟動Print Spooler服務錯誤193:0xc1的解決方案主要涉及修復服務依賴關系、清理打印緩存及修復系統文件?。該錯誤通常由系統文件損壞、注冊表配置異常或依賴服務未啟動導致,可通過以下步驟系統化解決。?? 解決方法:替換…

C++ map代碼練習 1、2、priority_queue基礎概念、對象創建、數據插入、獲取堆頂、出隊操作、大小操作,自定義結構、代碼練習 1 2

map代碼練習1&#xff0c;對應力扣 兩個數據的交集&#xff0c;代碼見下 class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {map<int, int> cnt;vector<int> ans;for(int i0; i<nums1.size(…

三天沖刺《編譯原理》——筆記(一)

點關注不迷路喲。你的點贊、收藏&#xff0c;一鍵三連&#xff0c;是我持續更新的動力喲&#xff01;&#xff01;&#xff01; 持續關注我~~~主頁&#xff0c;查看更多內容喲&#xff08;希望你能在這里有所收獲&#x1f92d;&#xff09;。點關注&#xff0c;不迷路&#xf…

代理模式Proxy Pattern

模式定義 給某一個對象提供一個代理&#xff0c;并由代理對象控制對原對象的引用 對象結構型模式 模式結構 Subject&#xff1a;抽象主題角色Proxy&#xff1a;代理主題角色RealSubject&#xff1a;真實主題角色 代理類實現代碼 public class Proxy implements Subject {p…

基于YOLOv11與單目測距的實戰教程:從目標檢測到距離估算

引言 在計算機視覺領域&#xff0c;目標檢測與距離估算的結合是自動駕駛、機器人導航等場景的關鍵技術。本文將以YOLOv8模型為核心&#xff0c;結合單目相機的幾何模型&#xff0c;實現對視頻中目標的實時檢測與距離估算。代碼參考自單目測距原理博客&#xff0c;并通過實踐驗…

代碼生成器使用原理以及使用方法

代碼生成器使用原理以及使用方法 版本號&#xff1a;1.0 二Ο二五年二月 目錄 文檔介紹 1.1編寫目的 1.2文檔范圍 1.3讀者對象 系統設計 2.1設計目標 2.2設計思路 2.3代碼實現原理 使用方法 3.1如何使用 3.2如何修改&#xff1f; 對原程序的bug修改及簡…

STM32標準庫-I2C通信

文章目錄 一、I2C通信1.1 I2C1.2硬件電路1.3I2C時序基本單元1.4I2C時序 二、MPU60502.1簡介2.2MPU6050參數2.3硬件電路2.4MPU6050框圖 三、I2C外設(硬件)3.1簡介3.2I2C框圖3.3I2C基本結構3.4主機發送3.5主機接收3.6軟件/硬件波形對比1. 時序精度2. 信號穩定性3. 速率與效率4. 波…

使用 Azure LLM Functions 與 Elasticsearch 構建更智能的查詢體驗

作者&#xff1a;來自 Elastic Jonathan Simon 及 James Williams 試用這個示例房地產搜索應用&#xff0c;它結合了 Azure Gen AI LLM Functions 與 Elasticsearch&#xff0c;提供靈活的混合搜索結果。在 GitHub Codespaces 中查看逐步配置和運行該示例應用的方法。 更多閱讀…

模糊查詢 的深度技術解析

以下是 模糊查詢 的深度技術解析&#xff0c;涵蓋核心語法、通配符策略、性能優化及實戰陷阱&#xff1a; &#x1f50d; 一、核心運算符&#xff1a;LIKE SELECT * FROM 表名 WHERE 列名 LIKE 模式字符串;&#x1f3af; 二、通配符詳解 通配符作用示例匹配案例%任意長度字符…

[論文閱讀] (39)EuroSP25 CTINEXUS:基于大模型的威脅情報知識圖譜自動構建

《娜璋帶你讀論文》系列主要是督促自己閱讀優秀論文及聽取學術講座&#xff0c;并分享給大家&#xff0c;希望您喜歡。由于作者的英文水平和學術能力不高&#xff0c;需要不斷提升&#xff0c;所以還請大家批評指正&#xff0c;非常歡迎大家給我留言評論&#xff0c;學術路上期…

強化學習三大分類

核心目標&#xff1a; 教會一個智能體&#xff08;比如機器人、游戲AI、推薦系統&#xff09;通過試錯和獎勵&#xff0c;學會在某個環境中完成特定任務的最佳策略。 核心角色&#xff1a; 智能體 (Agent)&#xff1a; 學習者&#xff0c;比如玩游戲的小人、控制溫度的空調系…

城市排水生命線安全運行監測項目

近年來&#xff0c;城市內澇、污水溢流等問題頻發&#xff0c;讓排水管網這一"城市生命線"的安全運行備受關注。如何讓地下的"毛細血管"更智能、更可靠&#xff1f;本文將帶您深入解析城市排水生命線安全運行監測項目的建設邏輯與技術內核&#xff0c;看科…

LeetCode - 34. 在排序數組中查找元素的第一個和最后一個位置

題目 34. 在排序數組中查找元素的第一個和最后一個位置 - 力扣&#xff08;LeetCode&#xff09; 思路 查找左邊界 初始化 left 0, right nums.size() - 1 當 left < right 時循環&#xff1a; 計算中點 mid left (right - left) / 2 如果 nums[mid] < target…

Tesollo四指靈巧手DG-4F:18自由度與多種抓取模式結合實現高精度操作

Tesollo四指靈巧手 DG-4F 是一款具備 18 自由度的多模態末端執行器&#xff0c;采用模塊化結構設計&#xff0c;融合人手靈活性與夾爪高效性特點。該產品兼容 Universal Robots、Techman、Doosan Robotics、Rainbow Robotics 等主流機器人平臺&#xff0c;適用于工業自動化、科…

深入淺出JavaScript 原型鏈:對象繼承的“隱形鏈條”

深入淺出JavaScript 原型鏈&#xff1a;對象繼承的“隱形鏈條” 在 JavaScript 的世界里&#xff0c;原型鏈&#xff08;Prototype Chain&#xff09;是一個核心概念。它如同一條隱形的鏈條&#xff0c;連接著所有對象&#xff0c;使得代碼能夠高效地共享屬性和方法。理解原型…

LINUX中MYSQL的使用

LINUX中MYSQL的使用 MYSQL的數據類型 bool&#xff1a; 布爾類型 0 或者 1 CHAR&#xff1a; 單字符的字符 CHAR&#xff08;n&#xff09;:多字節字符 VARCHAR&#xff08;n&#xff09;&#xff1a;可變長度的字符型 TINYINT &#xff1a; 單字節整型 SMALLINT&#x…