1. 程式人生 > >《C語言深度剖析》筆記

《C語言深度剖析》筆記

可變 單詞 符號 所有 只讀 存儲 nbsp min stat

關鍵字:

C語言關鍵字32個:

關鍵字 意 義

auto 聲明自動變量,缺省時編譯器一般默認為 auto

int 聲明整型變量

double 聲明雙精度變量

long 聲明長整型變量

char 聲明字符型變量

float 聲明浮點型變量

short 聲明短整型變量

signed 聲明有符號類型變量

unsigned 聲明無符號類型變量

struct 聲明結構體變量

union 聲明聯合數據類型

enum 聲明枚舉類型

static 聲明靜態變量

switch 用於開關語句

case 開關語句分支

default 開關語句中的“其他”分支

break 跳出當前循環

register 聲明寄存器變量

const 聲明只讀變量

volatile 說明變量在程序執行中可被隱含地改變

typedef 用以給數據類型取別名(當然還有其他作用)

extern 聲明變量是在其他文件正聲明(也可以看做是引用變量)

return 子程序返回語句(可以帶參數,也可不帶參數)

void 聲明函數無返回值或無參數,聲明空類型指針

continue 結束當前循環,開始下一輪循環

do 循環語句的循環體

while 循環語句的循環條件

if 條件語句

else 條件語句否定分支(與 if 連用)

for 一種循環語句(可意會不可言傳)

goto 無條件跳轉語句

sizeof 計算對象所占內存空間大小

auto:編譯器在默認的缺省情況下,所有變量都是auto的。

register:這個關鍵字請求編譯器盡可能的將變量存在 CPU 內部寄存器中而不是通過內

存尋址訪問以提高效率。

register 變量必須是一個單個的值,並且其長度應小於或等於整型的長度。 而且 register 變量可能不存放在內存中, 所以不能用取址運算符“ &”來獲取 register 變量的地址。

static:這個關鍵字在 C 語言裏主要有兩個作用。

第一個作用:修飾變量。變量又分為局部和全局變量,但它們都存在內存的靜態區。

靜態全局變量,作用域僅限於變量被定義的文件中,其他文件即使用 extern 聲明也沒法

使用他。準確地說作用域是從定義之處開始,到文件結尾處結束,在定義之處前面的那些

代碼行也不能使用它。想要使用就得在前面再加 extern ***。

靜態局部變量,在函數體裏面定義的,就只能在這個函數裏用了,同一個文檔中的其他

函數也用不了。由於被 static 修飾的變量總是存在內存的靜態區,所以即使這個函數運行結束,這個靜態變量的值還是不會被銷毀,函數下次使用時仍然能用到這個值。

第二個作用:修飾函數。函數前加 static 使得函數成為靜態函數。函數的作用域僅局限於本文件(所以又稱內部函數)。使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。

【規則 1-1】命名應當直觀且可以拼讀,可望文知意,便於記憶和閱讀。

【規則 1-2】命名的長度應當符合“min-length && max-information”原則。

【規則 1-3】當標識符由多個詞組成時,每個詞的第一個字母大寫,其余全部小寫。

【規則 1-4】盡量避免名字中出現數字編號,如 Value1,Value2 等,除非邏輯上的確需要編

號。比如驅動開發時為管腳命名,非編號名字反而不好。

【規則 1-5】對在多個文件之間共同使用的全局變量或函數要加範圍限定符(建議使用模塊名(縮寫)作為範圍限定符)。

【規則 1-6】標識符名分為兩部分:規範標識符前綴(後綴) + 含義標識 。非全局變量可以不用使用範圍限定符前綴。

【規則 1-7】作用域前綴命名規則。

【規則 1-8】數據類型前綴命名規則。

【規則 1-9】含義標識命名規則,變量命名使用名詞性詞組,函數命名使用動詞性詞組。

【規則 1-10】程序中不得出現僅靠大小寫區分的相似的標識符。

【規則 1-11】一個函數名禁止被用於其它之處。

【規則 1-12】所有宏定義、枚舉常數、只讀變量全用大寫字母命名,用下劃線分割單詞。

風格這些應與項目中一致,與項目開發成員共同約定並在詳細設計文檔中給出

【規則 1-13】考慮到習慣性問題,局部變量中可采用通用的命名方式,僅限於 n、 i、 j 等作為循環變量使用。

【規則 1-14】定義變量的同時千萬千萬別忘了初始化。定義變量時編譯器並不一定清空了

這塊內存,它的值可能是無效的數據。

【規則 1-15】不同類型數據之間的運算要註意精度擴展問題,一般低精度數據將向高精度

數據擴展。

sizeof:sizeof 在計算變量所占空間大小時,括號可以省略,而計算類型(模子)大小時不能省略。

sizeof(int) *p的意思是sizeof(int)的值乘於p

int a[100] sizeof(a) = 400 sizeof(&a) = 400 sizeof(&a[0]) = 4

&a不是指向指針的指針,因為&a和a的值相等,但是*&a和*a的值不相等。*&a和a的值一樣,說明*&a僅僅是對這個數組指針進行了取值,取得的是數組的值,即數組首元素的地址,而不是對&a這個地址進行了取值。這個應該是c語言中針對數組指針運算的規定。

Signed + unsigned = unsigned

空指令盡量用NULL;而不是一個分號;要讓人知道這裏不執行如何操作。

【規則 1-17】先處理正常情況,再處理異常情況。

在編寫代碼是,要使得正常情況的執行代碼清晰,確認那些不常發生的異常情況處理

代碼不會遮掩正常的執行路徑。這樣對於代碼的可讀性和性能都很重要。

case 後面只能是整型或字符型的常量或常量表達式

【規則 1-21】按字母或數字順序排列各條 case 語句。

【規則 1-22】把正常情況放在前面,而把異常情況放在後面。

【規則 1-23】按執行頻率排列 case 語句

【規則 1-24】簡化每種情況對應的操作。

continue語句只用在for、while、do-while等循環體中, 常與if條件語句一起使用, 用來加速循環。不能應用在switch中。

【規則 1-34】如果函數無參數,那麽應聲明其參數為 void 因為有的編譯器無參數可以編譯通過

void *pvid; pvoid++;ANSI錯誤 GNU正確

【規則 1-38】 return 語句不可返回指向“棧內存”的“指針”,因為該內存在函數體結束時被自動銷毀。

return; 在ARM裏面返回的r是r0,其它芯片不知道,需要查一下寄存器程序調用規則,

int a = return ; 那麽a = r0的值。

const: 定義 const 只讀變量,具有不可變性。

case 語句後面是不可以可以是 const 修飾的只讀變量

節省空間,避免不必要的內存分配,同時提高效率,(不分配存儲空間,是一個編譯期間的值)

const 定義的只讀變量在程序運行過程中只有一份拷貝(因為它是全局的只讀變量,存放在靜態區),而#define 定義的宏常量在內存中有若幹個拷貝。

const int *p; //const 修飾*p,p 是指針, *p 是指針指向的對象,不可變

int const *p; //const 修飾*p,p 是指針, *p 是指針指向的對象,不可變

int *const p; //const 修飾 p, p 不可變, p 指向的對象可變

const int *const p; //前一個 const 修飾*p,後一個 const 修飾 p,指針 p 和 p 指向的對象

都不可變

volatile :const volatile int i= 10;實際上此聲明表示的申明了一個const int型的變量,所以i是只讀變量,不能被修改。同時i又被volatile修飾了,意思就是說不允許編譯器優化代碼,在代碼中每次用到i時都要直接從內存中去取數。

所以,雖然const volatile int i = 10;定義沒錯,但是這樣的定義沒有什麽實際的意義。

extern int i; //寫成 i = 10;行嗎? 全局可以,全局變量默認是extern 局部不行

extern void fun( void);//兩個 void 可否省略?可以,函數默認是int

int j = 1; extern double j; //這樣行嗎?為什麽? 可以,extern只是聲明

struct: 空結構 sizeof為1;

C99 中,結構中的最後一個元素允許是未知大小的數組,這就叫做柔性數組成員,但結

構中的柔性數組成員前面必須至少一個其他成員。柔性數組成員允許結構中包含一個大小可

變的數組。sizeof 返回的這種結構大小不包括柔性數組的內存。包含柔性數組成員的結構用

malloc ()函數進行內存的動態分配,並且分配的內存應該大於結構的大小,以適應柔性數組

的預期大小。typedef struct

{

char c;

int a[];

}aa;

sizeof(aa)為4;

union大小端模式判斷:

int checkSystem( )

{

union check

{

int i;

char ch;

} c;

c.i = 1;

return (c.ch ==1);

}

const Stu_pst stu3; Stu_pst是類型省略,修飾指針。

編譯器用空格代替原來的註釋

《C語言深度剖析》筆記