標籤:常量 include 形參 區別 title 編譯器 錯誤 比較 內容
title : C語言函數與程式結構
tags : C語言範圍規則 , 外部變數 ,靜態變數 ,寄存器變數,宏定義
grammar_cjkRuby: true
---
外部變數
變數聲明用於說明變數的屬性(類型),而變數定義還會引起儲存空間分配
int sp;double s[MAX];
聲明地方:函數外
如果上面的變數定義在所有函數之外,即為外部變數,並為這兩個外部變數sp、s[MAX],分配儲存單元以及數組的長度,在其源檔案中的所有函數都可以使用這兩個外部變數。
extern int sp;extern double s[MAX];
為該源檔案聲明兩個外部變數sp、s[MAX],不同的是這兩個變數的長度在來源程式的其他源檔案中定義,沒有再重建立立變數和分配儲存單元。
來源程式的所有源檔案中,一個外部變數只能在某一個檔案中聲明,而其他地方不能再定義一個相同的外部變數,如果要使用該變數可以通過extern聲明進行訪問。
外部變數定義的地方必須指明數組的長度。
靜態變數
static int sp;static double s[MAX];
聲明地方:函數外,函數內
將sp、s[MAX]這兩個外部變數聲明為靜態變數,除了該源檔案內的函數可以訪問sp、s[MAX],但是其他檔案不可以通過extern訪問靜態變數sp和s[MAX]。
同樣static同樣也可以聲明自動變數(在函數內部定義使用的變數),不過不同於其他內部變數,該變數不管其所在函數是不是被主函數調用,它一直存在不會隨著所在函數被調用退出之後而消失,也就是說用static定義的內部變數只能在特定的函數內有自己獨立的儲存空間。
寄存器變數
register int sp;register double s[MAX];
聲明地方:函數內以及函數的形參
register的作用是告訴編譯器,它聲明的變數在程式中使用的頻率較高,把聲明的變數放在機器的寄存器中,這樣會使程式更小、執行速度更快
程式塊
while(***){ int i=1; if(***){ …… } ……}
花括弧包括的語句就是一個程式塊,在其中聲明的變數會隱藏程式塊以外的同名變數,該程式塊內聲明的變數和之外的變數無關,同樣靜態變數只會被初始化一次。
初始化
外部變數不進行初始化的話會直接初始化為0,而自動變數和局部變數沒有進行初始化的話則視為沒有定義(無用的資訊)。
外部變數的初始化定義必須為常量運算式,不能包含其他已經定義的變數,相反自動變數和局部變數則可以包含
對於數組的初始化,外部變數的聲明中如果後面的初始設定式個數小於元數,那直接把多的元素初始化為0,相反對於局部變數則會引發錯誤
字串數組聲明比較特殊,可以直接用""來代替{}
C語言前置處理器
#include " "和
#include< >的區別
#include(檔案包含指令)使得處理大量的#define指令以及聲明更加方便,使得源檔案裡直接包含檔案名稱指定的檔案內容。
#include " "在源檔案所在的位置尋找該檔案,如果沒尋找到該檔案則根據相應規則尋找該檔案,
#include< >直接根據相應規則尋找該檔案
宏替換
#define 名字 文本將出現名字的地方都會被替換為文本,可以將較長行分為若干行,只需在待續行的末尾加上反斜線\即可
#define宏定義的範圍是從定義點開始,然後一直到源檔案的結尾
#define宏定義的不能對引號裡面的字串有用,如printf("YES")
#udef取消宏定義
#define也可以帶上參數,這樣就可以像實際參數一樣,#define max(a,b) (a)>(b) ? (a) : (b)
條件包含
使用條件陳述式對預先處理的語句進行判斷,在預先處理執行的過程中進行運算,可以在編譯過程中根據計算所得的條件值選擇性的包含不同的代碼提供手段。
#if !defined(名字)…… #else / #endif / #elif……
defined(名字)表示當名字被定義,其值為1;否則,其值為0
#if !defined(HDR)#define HDR #endif
這樣可以將每個標頭檔所依賴的其他標頭檔包含進來
C語言函數與程式結構