標籤:來源程式 blog 檔案 程式 highlight 維護 一個 步驟 局部變數
目錄
4.1 函數的基本知識4.2 返回非整型值的函數4.3 外部變數4.4 範圍規則4.5 標頭檔4.6 靜態變數4.7 寄存器變數4.8 程式塊結構4.9 初始化4.10 遞迴4.11 C前置處理器 檔案包含 宏替換 條件包含
4.1 函數的基本知識
函數可以把大的計算任務分解成若干個較小的任務C語言在設計中考慮了函數的高效性與易用性這兩個因素程式可以看成是變數定義和函數定義的集合函數之間的通訊可以通過參數、函數傳回值以及外部變數進行函數在源檔案中出現的次序可以是任意的,只要保證一個函數不被分離到多個檔案中
4.3 外部變數
C語言程式可以看成是由一系列的外部對象構成,這些外部對象可能是變數或函數external與internal是相對的,internal用於描述定義在函數內部的函數參數及變數外部變數定義在函數之外,因此可以在許多函數中使用由於C語言不允許在一個函數中定義其他函數,因此函數本身是"外部的"通過同一個名字對外部變數的所有引用實際上都是引用同一個對象外部變數的用途還表現在它們與內部變數相比具有更大的範圍和更長的生存期自動變數只能在函數內部使用,從其所在的函數被調用時開始存在,在函數退出時變數也將消失外部變數是永久存在的,它們的值在一次函數調用到下一次函數調用之間保持不變
4.4 範圍規則
構成C語言程式的函數與外部變數可以分開進行編譯一個程式可以存放在幾個檔案中,原先已編譯過的函數可以從庫中進行載入名字的範圍指的是程式中可以使用該名字的部分對於在函數開關聲明的自動變數來說,其範圍是聲明該變數名的函數不同函數中聲明的具有相同名字的各個局部變數之間沒有任何關係函數的參數也是一樣的,實際上可買將它看作是局部變數外部變數或函數的範圍從聲明它的地方開始,到其所在檔案的末尾結束如果要在外部變數的定義之前使用該變數,或者外部變數的定義與變數的使用不在同一個源檔案中,則必須在相應的變數聲明中強制性地使用extern將外部變數的聲明與定義嚴格區分開來很重要。變數聲明說明變數的屬性,而變數定義除此之外還將引起儲存空間的分配在一個來源程式的所有源檔案中,一個外部變數只能在某個檔案中定義一次,而其他檔案可以通過extern聲明來訪問它外部變數的定義中必須指定數組的長度,但extern聲明則不一定要指定數組的長度外部變數的初始化只能出現在定義中
4.6 靜態變數
用static聲明限定外部變數與函數,可以將其後聲明的對象的範圍限定為被編譯源檔案的剩餘部分通過static限定外部對象,可以達到隱藏外部對象的目的外部的static聲明通常多用於變數,也可以用於聲明函數通常情況下函數是全域可以訪問的.但是,如果把函式宣告為static類型,則該函數名除了對該函式宣告所在的檔案可見外,其他檔案多無法訪問static也可以聲明內部變數.static類型的內部變數和自動變數一樣,是某個特定函數的局部變數,只能在該函數中使用,但它和自動變數不同的是,不管其所在函數是否被調用,它一直存在,而不像自動變數那樣,隨著所在函數的被調用和退出而存在和消失.static類型的內部變數是一種只能在某個特定函數中使用但一直佔據儲存空間的變數
4.7 寄存器變數
register聲明告訴編譯器,它聲明的變數在程式中使用的頻率較高其思想是,將register變數放在機器的寄存器中,這樣可以使程式更小,執行速度更快.但編譯器可以忽略此選項register聲明只適用於自動變數以及函數的形式參數.實際使用時,底層硬體環境的實際情況對寄存器變數的使用會有一些限制.每個函數中只有很少的變數可以保持在寄存器中,且只允許某些類型的變數但是,過量的寄存器聲明並沒聲明害處,這是因為編譯器可以忽略過量的或不支援的寄存器變數聲明.另外,無論寄存器變數實際上是不是存放寄存器中,它的地址都是不能訪問的
4.8 程式塊結構
變數的聲明除了可以緊跟在函數開始的花括弧之後,還可以緊跟在其他標示複合陳述式開始的左花括弧之後.
以這種方式聲明的變數可以隱藏程式塊與之同名的變數,它們之間沒有任何關係,並在左花括弧匹配的右花括弧出現之前一直存在.
4.9 初始化
在不進行顯式初始化的情況下,外部變數和靜態變數都將初始化為0,而自動變數和寄存器變數的初值則沒有定義(即初值為無用的資訊)對於外部變數和靜態變數來說,初始設定式必須是常量運算式,且只初始化一次(從概念上講是在程式開始執行之前進行初始化)對於自動變數與寄存器變數,則在每次進入函數或程式塊時都將被初始化對於自動變數和寄存器變數來說,初始設定式可以不是常量運算式:運算式中可以包含任意此運算式之前已經定義的值
4.10 遞迴
C語言中的函數可以遞迴調用,即函數可以直接或間接調用自身函數遞迴調用自身時,每次調用都會得到一個與以前的自動變數集合不同的新的自動變數集合遞迴並不節省儲存空間的開銷,因為遞迴調用過程中必須在某個地方維護一個儲存處理值的棧遞迴的執行速度並不快,但遞迴代碼比較緊湊,並且比相應的非遞迴代碼更易於編寫和理解
4.11 C前置處理器
C語言通過處理器提供了一些語言功能從概念上講,前置處理器是編譯過程中單獨執行的第一個步驟.兩個最常用的前置處理器指令是:#include 指令和#define指令
4.11.1 檔案包含#include "檔案名稱"#include <檔案名稱>如果檔案名稱用引號引起來,則在源檔案所在位置尋找該檔案;如果在該位置沒有找到檔案,或者如果檔案名稱是用角括弧<>括起來,則將根據相應的規則尋找該檔案,這個規則同具體的實現有關
4.11.2 宏替換#define 名字 替換文本後續所以出現名字記號的地方都將被替換為替換文本#define指令中的名字與變數名的命名方式相同,替換文本可以是任一字元串通常情況下#define指令佔一行,替換文本是#define指令行尾部的所以剩餘部分內容也可以把一個較長的宏替換分成若干行,需要在待續的行末尾加上一個反斜線#define指令定義的名字的範圍從其定義點開始,到被編譯的源檔案的末尾結束宏定義可以帶參數,這樣可以對不同的宏使用不同的替換文本
4.11.3 條件包含#ifndef HDR#define HDR#endif
《C程式設計語言》筆記 (四) 函數與程式結構