C語言深度解剖讀書筆記1

2021-09-02 17:31:50 字數 4150 閱讀 9991

關鍵字

意義關鍵字

意義auto

宣告自動變數,預設時編譯器一般預設為auto

register

宣告暫存器變數

int宣告整型變數

const

宣告唯讀變數

double

宣告雙精度變數

volatile

說明變數在程式執行中可被隱含地改變

long

宣告長整型變數

typedef

用以給資料型別取別名(當然還有其他作用)

char

宣告字元型變數

extern

宣告變數是在其他檔案中宣告(也可以看作是引用變數)

float

宣告浮點型變數

return

子程式返回語句(可以帶引數,也可以不帶引數)

short

宣告短整型變數

void

宣告函式無返回值或無引數,宣告空型別指標

signed

宣告有符號型別變數

continue

結束當前迴圈,開始下一輪迴圈

unsigned

宣告無符號型別變數

do迴圈語句的迴圈體

struct

宣告結構體變數

while

迴圈語句的迴圈條件

union

宣告聯合資料型別

if條件語句

enum

宣告列舉型別

else

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

static

宣告靜態變數

for一種迴圈語句

case

開關語句分支

goto

無條件跳轉語句

default

開關語句中的其他分支

sizeof

計算物件所佔記憶體空間大小

break

跳出當前迴圈

switch

用於開關語句

register變數必須是能被cpu暫存器接受的型別。意味著register變數必須是單一的值,長度<=整型長度,且register變數可能不存放在記憶體中,所以不能用 「&」 來獲取它的位址。

作用1:修飾變數。變數又分為區域性變數和全域性變數,但它們都存在記憶體的靜態區。

作用2:修飾函式。函式前加static使得函式成為靜態函式。此處static指對函式的作用域僅限於本檔案。

靜態全域性變數,作用城僅限於變數被定義的檔案中,其他檔案即使用extern宣告也沒法使用它。準確的說:作用城是從定義之處開始,到檔案結尾處結束,在定義之處前面的那些**行也不能使用它。

靜態區域性變數,在函式體裡面定義的,就只能在這個函式裡用了,同乙個文件中的其他函式也用不了。由於被static修飾的變數總是存在記憶體的靜態區,所以即使這個函式執行結束,這個靜態變數的值也不會被銷毀,函式下次使用時仍然能用到這個值。

sizeof在計算變數所佔空間大小時,括號可以省略,而計算型別(模子)大小時不能省略。且一般情況下,sizeof是在編譯時求值,所以sizeof(i++)不會引起***。由於sizeof(i++)與sizeof(i)結果一樣,所以沒必要也不允許寫這樣的**。同樣,sizeof(i=1234); 也不允許,因為 i 的值還是0,沒有改變。

用sizeof計算字串長度時會算上『\0』。

bool變數與「零值」的比較:

if語句寫法:

bool btestflaf = false ;

// if(btestflaf);這種寫法不會引起誤會

// if(!btestflaf);

float變數與「零值」的比較:

if語句寫法:

float ftestval = 0.0;

if((ftestval >= - epsinon) && (ftestval <= - epsinon) );

//epsinon為定義好的精度

指標變數與「零值」的比較:

if語句寫法:

int *p = null;//定義指標一定要初始化

//if(null == p);

//if(null != p);

else到底與哪個if配對

else始終與同一括號內最近的未匹配的if語句結合。

使用if語句的其他注意事項

void的字面意思是「空型別」,void *則為「空型別指標」,void *可以指向任何型別的資料。void 幾乎只有「注釋」和限制程式的作用。但是是可以定義乙個void變數。

void真正用:對函式返回的限定;對函式引數的限定。

眾所周知,如果指標p1和p2的型別相同,那麼我們可以直接在p1和p2間互相賦值;如果p1和p2指向不同的資料型別,則必須使用強制型別轉換運算子把賦值運算子右邊指標的型別轉換為左邊指標的型別。例如:

float *p1;

int *p2;

p1 = (float *)p2;

而void * 不同,任何型別的指標都可以直接賦值給它,無需進行強制型別轉換:

void *p1;

int *p2;

p1 = p2;

但這並不意味著,void*也可以無需進行強制型別轉換地賦給其他型別的指標,因為「空型別」可以包容「有型別」,而「有型別」則不能包容「空型別」。

void *p1;

int *p2;

p2 = p1;//編譯出錯

提示「『=』:cannot convert from 『void *』 to 『int *』 "。

void修飾函式返回值和引數

void不能代表乙個真實的變數

定義const唯讀變數,具有不可變性。

void fun(const int *p);
const int fun(void);
使用浮點數應遵循已定義好的浮點數標準:

在表示浮點數的各個位元組中,究竟用多少位表示小數部分,多少位表示指數部分,標準c中無具體定義。

ansi/ieee標準的基本規定如下所述。

禁止使用八迸制的常數 (0除外,因カ嚴格意義上來講0也是八迸制數) 和八迸制的轉義字元。

在計算機中,任何以0開頭的數字都被認為是八迸制格式的數(當然十六進製制的0x不算)。所以,當我們寫固定長度的數字時,會存在一定的風險。舉例如下:

code[1] = 109;//對應十迸制的109

code[2] = 100;//對應十迸制的100

code[3] = 052;//對應十迸制的42,因為052是以0開頭,以八進位制形式儲存

code[4] = 071;//對應十迸制的57

在轉義字元中後面跟八迸制數,用於表示ascli碼等於該值的字元,使用時也可能會出現意想不到的錯誤。

code[5] = 『\109';

/*可能代表兩個字元,『\10』後面的9因為超出八進位制表示範圍,被看作字元「9」*/

#include int main()

return 0;

}

執行報錯

in function 『main』:

error: case label does not reduce to an integer constant

case a:

continue語句與break語句使用場合類似,continue語句是不可以在單獨的switch語句中使用,但可以在乙個迴圈內的switch語句中使用

不能。continue語句一般形式為"continue"。

其作用為結束本次迴圈。即跳出迴圈體中下面尚未執行的語句,對於while迴圈,繼續求解迴圈條件。而對於for迴圈程式流程接著求解for語句頭中的第三個部分expression表示式。

continue語句的作用是跳過迴圈本中剩餘的語句,並到迴圈末尾。

continue語句只用在for、while、do-while等迴圈體中, 常與if條件語句一起使用, 用來加速迴圈。

讀書筆記《c語言深度解剖》 4

10.struct關鍵字 這裡struct關鍵字講解得比較少,主要有3點 1 空結構體的大小為1 在gcc下我的輸出是0 2 柔性陣列 在c99中,允許結構最後乙個元素是乙個大小未確定的陣列,這個陣列叫做柔性陣列。但是柔性陣列前面必須至少有乙個其他成員。用sizeof返回結構體大小的時候,並不包含柔...

C語言深度解剖讀書筆記3

int p null 和 p null 的區別int p null 可以通過偵錯程式檢視p的值為 0x00000000 這句 的意思是 定義乙個指標變數p,其指向的記憶體裡面儲存的是 int 型別的資料 在定義變數p的同時把p的值設定為 0x00000000,而不是把 p 的值設定為0x000000...

c語言深度解剖筆記1

2016.8.14 dage 複習內容 c語言深度解剖筆記1 有三大類 算術運算子 關係運算子與邏輯運算子,還有位運算子等,相同優先順序運算子,從左至右依次運算。注意字尾運算優先順序高於字首。因此 i 應解釋為 i 基本表示式 1級 最高 字尾表示式 2極 單目 一元運算 3級 強制型別表示式 4級...