C 語言是一種通用的、面向過程式的計算機程序設計語言。
C 語言最初是用於系統開發工作,特別是組成操作系統的程序。由於 C 語言所產生的代碼運行速度與彙編語言編寫的代碼運行速度幾乎一樣,所以採用 C 語言作爲系統開發語言。 從下列的應用實例也可以看出C語言作爲系統開發語言的特性:
- 操作系統
- 語言編譯器
- 彙編器
- 文本編輯器
- 打印機
- 網絡驅動器
- 現代程序
- 數據庫
- 語言解釋器
- 實體工具
Hello,world代碼分析
#include <stdio.h>
int main{
/* 我的第一個 C 程序 */
printf("Hello, World! \n");
return 0;
}
- 程序的第一行 #include <stdio.h> 是預處理器指令,告訴 C 編譯器在實際編譯之前要包含 stdio.h (標準輸入輸出頭)頭文件。如果沒有找到 stdio.h 頭文件,會發生編譯錯誤。
- 所有的 C 語言程序都需要包含 main()主函數。 代碼從 main() 函數開始執行。int是返回值的類型
- /* ... */ 用於註釋說明。
- printf() 用於格式化輸出到屏幕。printf() 函數在 "stdio.h" 頭文件中聲明。
- return 0; 語句用於表示退出程序,然會值類型必須與main前的類型聲明一致,否則編譯錯誤。
編譯 & 執行 C 程序
- 文本編輯器編寫上述代碼。
- 保存文件爲 hello.c,.c是C的源代碼文件。
- 打開命令提示符,進入到保存文件所在的目錄。
- 鍵入 gcc hello.c,編譯代碼。
- 生成 a.out 可執行文件,鍵入 a.out 來執行程序。
- 屏幕上打印輸出"Hello World"。
單個C源文件編譯執行命令示例:
gcc hello.c
./a.out
輸出:Hello, World!
多個C源文件編譯執行命令示例:
$ gcc test1.c test2.c -o main.out
$ ./main.out
C令牌(Tokens)
C 程序由各種令牌組成,令牌可以是關鍵字、標識符、常量、字符串值,或者是一個符號。
分號
在 C 程序中,分號是語句結束符。也就是說,每個語句必須以分號結束。它表明一個邏輯實體的結束。
註釋
單行註釋://
多行註釋:/* */,這種格式的註釋可以單行或多行。
標識符
C 標識符是用來標識變量、函數,或任何其他用戶自定義項目的名稱。標識符由字母、數字和下劃線組成,而且只能以字母和下劃線開頭。C 是區分大小寫的編程語言。
關鍵字
這些保留字不能作爲常量名、變量名或其他標識符名稱。
關鍵字 | 說明 |
---|---|
auto | 聲明自動變量 |
break | 跳出當前循環 |
case | 開關語句分支 |
char | 聲明字符型變量或函數返回值類型 |
const | 聲明只讀變量 |
continue | 結束當前循環,開始下一輪循環 |
default | 開關語句中的"其它"分支 |
do | 循環語句的循環體 |
double | 聲明雙精度浮點型變量或函數返回值類型 |
else | 條件語句否定分支(與 if 連用) |
enum | 聲明枚舉類型 |
extern | 聲明變量或函數是在其它文件或本文件的其他位置定義 |
float | 聲明浮點型變量或函數返回值類型 |
for | 一種循環語句 |
goto | 無條件跳轉語句 |
if | 條件語句 |
int | 聲明整型變量或函數 |
long | 聲明長整型變量或函數返回值類型 |
register | 聲明寄存器變量 |
return | 子程序返回語句(可以帶參數,也可不帶參數) |
short | 聲明短整型變量或函數 |
signed | 聲明有符號類型變量或函數 |
sizeof | 計算數據類型或變量長度(即所佔字節數) |
static | 聲明靜態變量 |
struct | 聲明結構體類型 |
switch | 用於開關語句 |
typedef | 用以給數據類型取別名 |
unsigned | 聲明無符號類型變量或函數 |
union | 聲明共用體類型 |
void | 聲明函數無返回值或無參數,聲明無類型指針 |
volatile | 說明變量在程序執行中可被隱含地改變 |
while | 循環語句的循環條件 |
新增加關鍵字
_Bool | _Complex | _Imaginary | inline | restric |
_Alignas | _Alignof | _Atomic | _Generic | _Noreturn |
_Static_assert | _Thread_local |
C中空格
只包含空格的行,被稱爲空白行,會被編譯器完全忽略
空格分隔語句的各個部分,讓編譯器能識別語句中的某個元素(比如 int)在哪裏結束。爲了增強可讀性,表達式的標識符、運算符等之間添加空格
C 數據類型
變量的類型決定了變量存儲佔用的空間,以及如何解釋存儲的位模式。C 中的類型可分爲以下幾種:
序號 | 類型與描述 |
---|---|
1 | 基本類型: 算術類型,包括兩種類型:整數類型和浮點類型。 |
2 | 枚舉類型: 算術類型,被用來定義在程序中只能賦予其一定的離散整數值的變量。 |
3 | void 類型: 類型說明符 void 表明沒有可用的值。 |
4 | 派生類型: 它們包括:指針類型、數組類型、結構類型、共用體類型和函數類型。 |
數組類型和結構類型統稱爲聚合類型。函數的類型指的是函數返回值的類型。
整數類型和浮點類型
標準整數類型的存儲大小和值範圍的細節(32位和64位):
float,單精度浮點值。單精度是這樣的格式,1位符號,8位指數,23位小數。
double,雙精度浮點值。雙精度是1位符號,11位指數,52位小數。
使用sizeof 運算符。表達式 sizeof(type) 得到對象或類型的存儲字節大小。
示例:
#include <stdio.h>
#include <float.h>
#include <limits.h>
int main()
{ //%lu 爲 32 位無符號整數
printf("int 存儲大小 : %lu \n", sizeof(int));
printf("float 存儲最大字節數 : %lu \n", sizeof(float));
//%E 爲以指數形式輸出單、雙精度實數
printf("float 最小值: %E\n", FLT_MIN );
printf("float 最大值: %E\n", FLT_MAX );
printf("精度值: %d\n", FLT_DIG );
return 0;
}
void 類型
void 類型指定沒有可用的值,表示類型的缺失。它通常用於以下三種情況下:
序號 | 類型與描述 |
---|---|
1 | 函數返回爲空 C 中有各種函數都不返回值,或者您可以說它們返回空。不返回值的函數的返回類型爲空。例如 void exit (int status); |
2 | 函數參數爲空 C 中有各種函數不接受任何參數。不帶參數的函數可以接受一個 void。例如 int rand(void); |
3 | 指針指向 void 類型爲 void * 的指針代表對象的地址,而不是類型。例如,內存分配函數 void *malloc( size_t size ); 返回指向 void 的指針,可以轉換爲任何數據類型。 |
類型轉換
1、數據類型轉換:C 語言中如果一個表達式中含有不同類型的常量和變量,在計算時,會將它們自動轉換爲同一種類型;在 C 語言中也可以對數據類型進行強制轉換;
2、自動轉換規則:
- a)浮點數賦給整型,該浮點數小數被捨去;
- b)整數賦給浮點型,數值不變,但是被存儲到相應的浮點型變量中;
3、強制類型轉換形式: (類型說明符)(表達式)
C變量和常量
變量其實只不過是程序可操作的存儲區的名稱。常量是指程序在運行時其值不能改變的量。常量不佔內存,在程序運行時它作爲操作對象直接出現在運算器的各種寄存器中,又稱作字面量。變量是指在程序運行時其值可以改變的量。變量的功能就是存儲數據。標識符應做到‘顧名思義’。
變量定義
語法:
//僅定義
type variable_list;
//或定義並初始化(指定一個初始值)
type variable_name = value;
對於不帶初始化值的定義:帶有靜態存儲持續時間的變量會被隱式初始化爲 NULL(所有字節的值都是 0),其他所有變量的初始值是未定義的。
變量聲明
變量的聲明有兩種情況:
- 1、一種是需要建立存儲空間的。例如:int a 在聲明的時候就已經建立了存儲空間。
- 2、另一種是不需要建立存儲空間的,通過使用extern關鍵字聲明變量名而不定義它。 例如:extern int a 其中變量 a 可以在別的文件中定義的。
- 除非有extern關鍵字,否則都是變量的聲明加定義。
若要一個源文件中引用另外一個源文件中定義的變量,我們只需在需要引用的文件中將變量加上 extern 關鍵字的聲明。
整數常量用0x 或 0X 表示十六進制,0 表示八進制,不帶前綴則默認表示十進制。後綴是 U 和 L 的組合,U 表示無符號整數(unsigned),L 表示長整數(long)。後綴可以是大寫,也可以是小寫,U 和 L 的順序任意。
浮點常量由整數部分、小數點、小數部分和指數部分組成。
字符常量是括在單引號中,例如,'x' 可以存儲在 char 類型的簡單變量中。
字符串字面值或常量是括在雙引號 "" 中的。一個字符串包含類似於字符常量的字符:普通的字符、轉義序列和通用的字符。使用空格做分隔符,把一個很長的字符串常量進行分行。下列字符串字面值是顯示相同的:字符串字面值或常量是括在雙引號 "" 中的。一個字符串包含類似於字符常量的字符:普通的字符、轉義序列和通用的字符。使用空格做分隔符,把一個很長的字符串常量進行分行。下列字符串字面值是顯示相同的
:
"hello, dear"
"hello, \
dear"
"hello, " "d" "ear"
常量的定義
C 中,有兩種簡單的定義常量的方式:
- 使用 #define 預處理器。 #define identifier value;
- 使用 const 關鍵字。: const type variable = value;
常量常常更應該定義爲大寫字母形式。