C 中,有特定的字符,當它們前面有反斜槓時,它們就具有特殊的含義,被用來表示如換行符(\n)或製表符,下表列出了一些這樣的轉義序列碼:
轉義序列 | 含義 |
---|---|
\\ | \ 字符 |
\' | ' 字符 |
\" | " 字符 |
\? | ? 字符 |
\a | 警報鈴聲 |
\b | 退格鍵 |
\f | 換頁符 |
\n | 換行符 |
\r | 回車 |
\t | 水平製表符 |
\v | 垂直製表符 |
\ooo | 一到三位的八進制數 |
\xhh . . . | 一個或多個數字的十六進制數 |
C存儲類
存儲類定義 C 程序中變量/函數的範圍(可見性)和生命週期。這些關鍵字放在被描述的類型前面。C 程序中可用的存儲類:
- auto:所有局部變量默認的存儲類,
- register:用於聲明存儲在寄存器中而不是 RAM 中的局部變量。這意味着變量的最大尺寸等於寄存器的大小(通常是一個詞),且不能對它應用一元的 '&' 運算符(因爲它沒有內存位置)。寄存器用於需要快速訪問的變量,定義 'register' 並不意味着變量將被存儲在寄存器中,它意味着變量可能存儲在寄存器中
- static:指示編譯器在程序的生命週期內保持局部變量的存在,而不需要在每次它進入和離開作用域時進行創建和銷燬,因此,使用 static 聲明的局部變量可以在函數調用之間保持局部變量的值。static 修飾符也可以應用於全局變量。當 static 修飾全局變量時,會使變量或者方法的作用域限制在聲明它的文件內,能被當前文件的任意函數和方法調用。
- extern:用於提供一個全局變量的引用,該聲明的全局變量對所有的程序文件都是可見的。對於extern 聲明的未初始化的變量,會把變量名指向一個之前定義過的存儲位置。
C 運算符
算術運算符
+(加),-(減),*(乘),/(整除),%(取餘),++(自增),--(自減)
對於++與-- ,當與賦值表達式一起使用時,在變量右則先賦值再自增或自減運算,在變量左則先自增或自減運算再賦值
關係運算符
==(相等),!=(不相等),>(大於),<(小於),>=(大於等於),<=(小於等於)
邏輯運算符
&&(邏輯與),||(邏輯或),!(邏輯非)
位運算符
位運算符作用於位,並逐位執行操作。
&(按位與), | (按位或), ^(按位異或),~(按位取反),<<(位左移運算符),>>(位右移運算符)
賦值運算符
=(賦值)
雜項運算符
sizeof()(返回變量大小), &(返回變量的地址),* (指向一個變量),a?b:c( a真則爲b,否則爲c)。
運算符優先級
下表將按運算符優先級從高到低列出各個運算符,具有較高優先級的運算符出現在表格的上面,具有較低優先級的運算符出現在表格的下面。在表達式中,較高優先級的運算符會優先被計算
類別 | 運算符 | 結合性 |
---|---|---|
後綴 | () [] -> . ++ - - | 從左到右 |
一元 | + - ! ~ ++ - - (type)* & sizeof | 從右到左 |
乘除 | * / % | 從左到右 |
加減 | + - | 從左到右 |
移位 | << >> | 從左到右 |
關係 | < <= > >= | 從左到右 |
相等 | == != | 從左到右 |
位與 AND | & | 從左到右 |
位異或 XOR | ^ | 從左到右 |
位或 OR | | | 從左到右 |
邏輯與 AND | && | 從左到右 |
邏輯或 OR | || | 從左到右 |
條件 | ?: | 從右到左 |
賦值 | = += -= *= /= %=>>= <<= &= ^= |= | 從右到左 |
逗號 | , | 從左到右 |
C 判斷
C 語言把任何非零和非空的值假定爲 true,把零或 null 假定爲 false。
if...else if...else 和 switch
switch 語句必須遵循下面的規則:
- switch 語句中的 expression 是一個常量表達式,必須是一個整型或枚舉類型。
- 在一個 switch 中可以有任意數量的 case 語句。每個 case 後跟一個要比較的值和一個冒號。
- case 的 constant-expression 必須與 switch 中的變量具有相同的數據類型,且必須是一個常量或字面量。
- 當被測試的變量等於 case 中的常量時,case 後跟的語句將被執行,直到遇到 break 語句爲止。
- 當遇到 break 語句時,switch 終止,控制流將跳轉到 switch 語句後的下一行。
- 不是每一個 case 都需要包含 break。如果 case 語句不包含 break,控制流將會 繼續 後續的 case,直到遇到 break 爲止。
- 一個 switch 語句可以有一個可選的 default case,出現在 switch 的結尾。default case 可用於在上面所有 case 都不爲真時執行一個任務。default case 中的 break 語句不是必需的。
C 循環
while 循環(當給定條件爲真時,重複語句或語句組。),for 循環,break(終止循環或 switch 語句)、continue關鍵字(立刻停止本次循環迭代,重新開始下次循環迭代。)
for ( init; condition; increment )
{
statement(s);
}
for 循環的控制流:
- init 會首先被執行,且只會執行一次。這一步允許您聲明並初始化任何循環控制變量。您也可以不在這裏寫任何語句,只要有一個分號出現即可。
- 接下來,會判斷 condition。如果爲真,則執行循環主體。如果爲假,則不執行循環主體,且控制流會跳轉到緊接着 for 循環的下一條語句。
- 在執行完 for 循環主體後,控制流會跳回上面的 increment 語句。該語句允許您更新循環控制變量。該語句可以留空,只要在條件後有一個分號出現即可。
- 條件再次被判斷。如果爲真,則執行循環,這個過程會不斷重複(循環主體,然後增加步值,再然後重新判斷條件)。在條件變爲假時,for 循環終止。
使用 for(;;) 或者 while{} 結構來表示一個無限循環。當條件表達式不存在時,它被假設爲真。按 Ctrl + C 鍵終止一個無限循環。
C函數
定義函數
return_type function_name( parameter list )
{
body of the function
}
- 返回類型:一個函數可以返回一個值。return_type 是函數返回的值的數據類型。有些函數執行所需的操作而不返回值,在這種情況下,return_type 是關鍵字 void。
- 函數名稱:這是函數的實際名稱。函數名和參數列表一起構成了函數簽名。
- 參數:參數就像是佔位符。當函數被調用時,您向參數傳遞一個值,這個值被稱爲實際參數。參數列表包括函數參數的類型、順序、數量。參數是可選的,也就是說,函數可能不包含參數。
- 函數主體:函數主體包含一組定義函數執行任務的語句。
聲明函數和調用函數
return_type function_name( parameter list );
在函數聲明中,參數的名稱並不重要,只有參數的類型是必需的。
在一個源文件中定義函數且在另一個文件中調用函數時,函數聲明是必需的。在這種情況下,應該在調用者所在的文件頂部聲明函數。
調用函數時,傳遞所需參數,如果函數返回一個值,則可以存儲返回值。
函數參數
傳值調用:向函數傳遞參數的傳值調用方法,把參數的實際值複製給函數的形式參數。在這種情況下,修改函數內的形式參數不會影響實際參數。
引用調用:通過引用傳遞方式,形參爲指向實參地址的指針,當對形參的指向的地址進行操作時,就相當於對實參本身進行的操作,即改變了實參。
C 作用域規則
作用域是程序中定義的變量所存在的區域,超過該區域變量就不能被訪問。C 語言中有三個地方可以聲明變量:
- 在函數或塊內部的局部變量
- 在所有函數外部的全局變量
- 在形式參數的函數參數定義中
局部變量
在某個函數或塊的內部聲明的變量稱爲局部變量。它們只能被該函數或該代碼塊內部的語句使用。局部變量在函數外部是不可知的。
全局變量
全局變量是定義在函數外部。全局變量在整個程序生命週期內都是有效的,在任意的函數內部能訪問全局變量。
在函數內,如果局部變量的名字和全局變量名相同,會使用局部變量值,全局變量不會被使用。
全局變量與局部變量在內存中的區別:
- 全局變量保存在內存的全局存儲區中,佔用靜態的存儲單元;
- 局部變量保存在棧中,只有在所在函數被調用時才動態地爲變量分配存儲單元。
局部變量和全局變量初始化
局部變量被定義時,系統不會對其初始化,使用前必須自行對其初始化。而定義全局變量時,系統會自動對其初始化。全局變量初始化默認值如下:
數據類型 | 初始化默認值 |
---|---|
int | 0 |
char | '\0' |
float | 0 |
double | 0 |
pointer | NULL |