C語言深度剖析筆記

2021-04-15 09:58:15 字數 4049 閱讀 7398

第一章 32個關鍵字簡記

注:該筆記根據《c語言深度剖析》一書而成

sizeof是32個關鍵字之一

什麼是宣告?什麼是定義?詳見p11頁

定義與宣告的區別:定義建立了物件並為這個物件分配了記憶體,宣告沒有分配記憶體,可以先宣告把位子佔了(如函式的宣告),然後再定義

auto關鍵字(p12):可以當其不存在,預設情況下所有變數都是auto型的

register關鍵字(p12):請求編譯器盡可能的將變數儲存在cpu內部的暫存器中,是盡可能不是絕對,乙個cpu的暫存器也就幾個或者幾十個,訪問速度最快

register變數必須是乙個單個的值,而且其長度最長為乙個整型的長度。對這種變數不可以使用取址運算子來獲取其位址,因為它不再記憶體中

static關鍵字(p13):可以修飾變數也可以修飾函式、儲存區為記憶體中的靜態儲存區、修飾函式時是為了將該函式的作用域侷限於本檔案內,解決同名問題

例:#include

#include

static int j;

void fun1(void)

void fun2(void)

int main()

printf("\n j = %d\n",j);//此處的i不能輸出,因為fun1()函式的返回值是void型,static int i 的作用域為整個fun1()函式內,超出無效

//程式完結時, i=10; j=1;

return exit_success;

}》 1 2 3 4 5 6 7 8 9 10

j = 1

c語言的資料型別:

基本資料型別關鍵字(p14):short、long、int、char、float、double(共6種)

構造資料型別:陣列、結構體struct、公用體union、列舉型別enum

指標型別

空型別void

32位系統中:

short為2個位元組,int為4個位元組,long為4個位元組,float為4個位元組、

double為8個位元組,char為1個位元組(一般情況下)

隱式型別轉換:

short,char →→ int → unsigned int → long → double(主幹道) ←←float

char+char 是先隱式轉換為int的,再進行運算

任何資料都的先跑到主幹道,才能運算(int到double為主幹道,32位的問題)

變數名的命名規則(p15):注意x與x之間,1(數字1)與l(字母l)之間,0與o之間的區別,不建議使用這些易混淆的

定義了變數的同時千萬別忘了對其初始化

不同資料之間的運算要注意精度擴充套件問題,一般是低精度資料向高精度資料擴充套件

sizeof關鍵字(p19):

例:int i = 0;

a sizeof(int) b sizeof(i) c sizeof int d sizeof i

毫無疑問,在32位系統下a、b的值為4,其實d也是4

注:函式名後面沒有括號是絕對不行的,編譯c時,編譯器會提示出錯

我們可以在int前加unsight、const等關鍵字但是不能加sizeof關鍵字

sizeof在計算變數的大小時括號可以省略但是在計算型別的大小時括號是不可以省略的

sizeof (int)*p 是什麼意思?個人認為相當於是sizeof((int)*p)

例:#include

#include

void fun(int b[100])

int main()

》 sizeof(p) = 4

sizeof(*p) = 4

sizeof(a) = 400

sizeof(a[100]) = 4

sizeof(&a) = 4

sizeof(&a[0]) = 4

sizeof(b) = 4

signed、unsigned關鍵字(p20):在計算機系統中,任何資料到了底層都會被轉化成0、1 在預設的情況下,系統預設為是singed型

在計算機系統中數值用補碼儲存的原因是:使用補碼,可以將符號位與其他位統一處理,同時減法也可以按加法處理。兩個用補碼表示的數相加時,如果最高位(符號位)有進製,則進製被捨棄

-0 和 0 在記憶體裡是怎麼儲存的???

例:#include

#include

#include

int main()

printf("strlen(a) = %d\n",strlen(a));

return exit_success;

}》strlen(a) = 255

例:#include

#include

#include

int main()

》i+j = -10

例:#include

#include

int main()

return exit_success;

}》程式無限迴圈,失控,輸出的貌似是記憶體位址,從第乙個隨機十位數開始,依次減一,無限下去

if、else 關鍵字(p21):bool型的資料初始化時一般初始化為false,這樣比較好

注意float型資料與0值進行比較的問題,float、double型資料的精度是有限度的注:不要在很大的浮點數與很小的浮點數之間進行運算,其結果會讓你無奈

注意指標變數與0值的比較,推薦寫法:if(null == p);if(null != p);

else始終與同括號內最近的未匹配的if語句結合,最好用規範的寫法,相見p23

不推薦使用tab鍵,要寫空語句時不要只寫乙個「;」要寫成「null;」

寫if語句時,一般情況下先處理正常情況再處理異常情況,以便提高效率,可讀性也較好

switch、case關鍵字(p25):注意default的使用,不要把其當case用也不要捨棄不用,另:case後只能是整型或字元型常量、為了可讀性等注意case的合理排序,注:

不要為了使用case語句而刻意製造乙個變數

do、while、for關鍵字(p29):在switch、case語句中能否使用continue??

注:迴圈的巢狀不要超過三層

goto關鍵字(p31):能不用這不用,若可以,捨棄吧!!

void關鍵字(p32):void*為空型別指標,可以指向任何型別的資料、void真正的作用是:1、對函式返回的限定 2、對函式引數的限定 。

任何型別的指標都可以直接賦值給void*型指標,這並不意味著void*也可以無需強制型別轉換直接賦值給其他型別的指標,如可以說「男人或者女人都是人」,但不能說「男人是人」

在c語言中,凡是不見返回時型別限定的函式,編譯器會預設為返回的是整型。

在c語言中,可以給無引數的函式傳送任意型別的引數,但在c++編譯器中會出錯,若函式不接受任何引數,一定要指明函式引數為void型

ansi規定:不能對void指標進行演算法操作,gun則規定:void*的演算法與char*的演算法一致,我們以ansi為標準。

可以這樣進行演算法操作:void* ptr ; (char*)ptr++;(char*)ptr += 1;

如果函式的引數可以是任意型別的指標,那麼應宣告其引數的型別為void*

return關鍵字(p35):用於終止乙個函式並返回其後跟的值

return (val);括號一般不省略,尤其返回是乙個表示式的值時。

return ; 返回的到底是什麼??

const關鍵字(p36):注:define不是關鍵字

const修飾的唯讀變數必須在定義的同時初始化,case後面是否可以是const修飾的唯讀變數——不可以 const與define的區別詳見p36

編譯器通常不會為const唯讀變數分配儲存空間,而是將他們儲存在符號表中,這是的它成為乙個編譯期間的值,值分配一次記憶體空間,存放在靜態區

#define m 3//巨集常量,注意語句的最後無分號

const int n = 6;//此時並未將n放入記憶體中

...int i = n;//此時為n分配記憶體,以後不在分配!

int i = m;//預編譯期間進行巨集替換,分配記憶體

int j = n;//沒有記憶體分配

int j = m;//再次進行巨集替換,又一次分配記憶體!

C語言深度剖析讀書筆記

第1章關鍵字 1.1 定義與宣告的區別 定義建立了物件並為物件分配了記憶體,宣告沒有分配記憶體 1.2 register請求編譯器盡可能將變數存在cpu暫存器中以提高訪問速度,register變數必須為cpu暫存器所能接受的型別,它須是乙個單一的值,並且長度 整型的長度,由於register變數可能...

c語言筆記總結

字型 font family 字型大小 font size font weight 設定或檢索物件中的文字字型的粗細。text decoration 檢索或設定物件中的文字的裝飾。font style 設定或檢索物件中的字型樣式。line height 設定或檢索行距。text transform ...

C語言總結筆記

c語言是面向結構的計算機高階語言,其兼具一般高階語言和低階語言的優點,c語言功能強大 應用廣泛,既可以用來編寫系統軟體,也可以用來編寫應用軟體。它具有以下幾個特點 1 語言簡潔 緊湊,使用方便 靈活。c語言程式比其他許多高階語言簡練,源程式短,因此輸入程式時工作量少。2 運算子豐富。c語言的運算子包...