天天看點

C語言深度解剖小結

1.關鍵字

ANSI C标準C語言共有32個 關鍵字,這些關鍵字如下: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 1999年12月16日,ISO推出了C99标準,該标準新增了5個C語言關鍵字: inline_restrict _Bool _Complex _Imaginary 2011年12月8日,ISO釋出C語言的新标準C11,該标準新增了1個C語言關鍵字: Generic -----------------------------------> static 修改變量 ,函數,主要兩個主面産生作用:作用域和生命周期; sizeof後可以不加括号(sizeof是關鍵字不是函數),例如sizeof x; 參數指明為void,表示該函數不接受任何參數,例如void fun(void)不是void fun(); const定義的隻讀變量在記憶體隻有一份拷貝,例如const int x=5; int m=x;// m沒有記憶體配置設定 指針+1的操作,1的機關取決于目前指針的機關,例如int a[5]={1,2,3,4,5};     (int*)(a+1), (int*)(&a+1)與(int*)((int)a+1)中1的含義不一緻;

sizeof(enum)是4,enum枚舉變量中的值是枚舉常量,相當于整型;      

2.符号

優先級 運算符 名稱或含義 使用形式 結合方向 說明
1 [] 數組下标 數組名[常量表達式] 左到右
() 圓括号 (表達式)/函數名(形參表)
. 成員選擇(對象) 對象.成員名
-> 成員選擇(指針) 對象指針->成員名
2 - 負号運算符 -表達式 右到左 單目運算符
(類型) 強制類型轉換 (資料類型)表達式
++ 自增運算符 ++變量名/變量名++ 單目運算符
-- 自減運算符 --變量名/變量名-- 單目運算符
* 取值運算符 *指針變量 單目運算符
& 取位址運算符 &變量名 單目運算符
! 邏輯非運算符 !表達式 單目運算符
~ 按位取反運算符 ~表達式 單目運算符
sizeof 長度運算符 sizeof(表達式)
3 / 表達式/表達式 左到右 雙目運算符
* 表達式*表達式 雙目運算符
% 餘數(取模) 整型表達式/整型表達式 雙目運算符
4 + 表達式+表達式 左到右 雙目運算符
- 表達式-表達式 雙目運算符
5 << 左移 變量<<表達式 左到右 雙目運算符
>> 右移 變量>>表達式 雙目運算符
6 > 大于 表達式>表達式 左到右 雙目運算符
>= 大于等于 表達式>=表達式 雙目運算符
< 小于 表達式<表達式 雙目運算符
<= 小于等于 表達式<=表達式 雙目運算符
7 == 等于 表達式==表達式 左到右 雙目運算符
!= 不等于 表達式!= 表達式 雙目運算符
8 & 按位與 表達式&表達式 左到右 雙目運算符
9 ^ 按位異或 表達式^表達式 左到右 雙目運算符
10 | 按位或 表達式|表達式 左到右 雙目運算符
11 && 邏輯與 表達式&&表達式 左到右 雙目運算符
12 || 邏輯或 表達式||表達式 左到右 雙目運算符
13 ?: 條件運算符 表達式1? 表達式2: 表達式3 右到左 三目運算符
14 = 指派運算符 變量=表達式 右到左
/= 除後指派 變量/=表達式
*= 乘後指派 變量*=表達式
%= 取模後指派 變量%=表達式
+= 加後指派 變量+=表達式
-= 減後指派 變量-=表達式
<<= 左移後指派 變量<<=表達式
>>= 右移後指派 變量>>=表達式
&= 按位與後指派 變量&=表達式
^= 按位異或後指派 變量^=表達式
|= 按位或後指派 變量|=表達式
15 , 逗号運算符 表達式,表達式,… 左到右 從左向右順序運算

說明:

同一優先級的運算符,運算次序由結合方向所決定。

簡單記就是:! > 算術運算符 > 關系運算符 > && > || > 指派運算符

C語言深度解剖小結

----------------------------------->

3.預處理

----------------------------------->

注釋先于預處理指令處理,是以不能用宏開始或結束一段注釋 可以這樣定義#define EMPTY 将宏所定義 的多條表達式放在大括 号中。

示例:下面的語句隻有 宏的第一條表達式被執 行。為了說明問題,f or 語句的書寫稍不符規範 。

#define INTI_RECT_ VALUE( a, b )\

a = 0;\

b = 0;

for (index = 0; index < RECT_TOTAL _NUM; index  )

INTI_RECT_ VALUE( rect.a, rect.b );

正确的用法應為:

#define INTI_RECT_ VALUE( a, b )\

{\

a = 0;\

b = 0;\

}

for (index = 0; index < RECT_TOTAL _NUM; index  )

{

INTI_RECT_ VALUE( rect[index ].a, rect[index ].b );

}

預處理指令中所有宏辨別答在使用前都應先定義,除了#ifdef  #ifndef  defined(),例如#if X<0//如果X未定義,預處理器可能不給提示,直接定義并置零 #pragma pack(n)對齊方式,3點注意事項: 1。每個成員分别按自己的方式對齊,并能最小化長度。

2。複雜類型(如結構,類)的預設對齊方式是他最長的成員的對齊方式,這樣成員是複雜類型時,可以最小化長度

3。對齊後的長度必須是成員中最大的對齊參數的整數倍,這樣在處理處理數組時可以保證每一項都邊界對齊 "#"的使用:把語言符号轉化為字元串 #define SQR(x) printf("The "#x"  is %d\n",((x)*(x))); SQR(8); output: The 8 is 64 "##"的使用:把兩個語言符号組合成單個語言符号 #define XNAME(n) x##n XNAME(8) output: x8 注意:"#"和"##"在單一宏定義中隻使用其中一個,且隻一次,盡量不要使用這兩個運算符

4.指針和數組

----------------------------------->

int a[5];//建立5個int的數組 sizeof(a[5]);// 值為4,正确,因為sizeof作為關鍵字,求值是在編譯的過程中,根據數組類型來進行計算; a與&a的值相同,但意義不一樣,a與a[0]意義一緻,表示首元素位址,&a表示整個數組的位址; int a[3][2]={(0,1),(2,3),(4,5)};與int a[3][2]={{0,1},{2,3},{4,5}};的區分; 函數指針,函數指針數組,函數指針數組指針的區分;

5.記憶體管理

----------------------------------->

可執行程式包括BSS(Block Started by Symbol)段、資料段、代碼段(也稱文本段),

然後還有堆heap,棧stack;

BSS存放的是未初始化的全局變量和靜态變量,資料段存放的是初始化後的全局變量和靜态變量,二者合并可以了解為全局區;

局部變量存放在棧區,動态變量存放在堆區;

6.函數

----------------------------------->

函數名與傳回值類型在語義上應不可沖突,典型反例是getchar,其傳回值是int,是以char c;if(EOF==(c=getchar())),這裡如果EOF值定義在char類型的int範圍以外,就會發生截斷;

7.檔案

----------------------------------->

8.C語言基礎測試題