C語言速成入門第1課:程序結構、數據類型、輸入輸出與控制流完整講義
作為系統級編程基石,C 語言以極簡語法支撐起現代計算機軟件棟梁。本講義為「C語言簡明教程」系列首課,涵蓋程序骨架、變量類型系統、格式化 I/O、條件判斷、循環構造五大核心模組,配備標準代碼範式與記憶圖表,助你在最短時間建立完整認知框架。
1. C 語言程序解剖:六大標準組件
#include <stdio.h> // 1. 預處理指令:引入標準庫頭文件
/* 多行註釋:程序功能、作者、版本 */
int main(void) { // 2. 入口函數:返回 int,參數 void 表無參
// 3. 變量定義區
int data; // 局部變量未初始化 → 值不確定
static int cdata = 0; // 靜態局部變量 → 自動歸零,存儲於 BSS 段
char *p = "Hello World!\n"; // 指針指向字符串常量(只讀數據段)
// 4. 函數調用與表達式語句
printf(p); // 庫函數調用
int flag = Show(p); // 自定義函數調用,接收返回值
return 0; // 5. 返回值:0 表成功,非 0 表錯誤碼
} // 6. 代碼塊結束
// 函數定義(可置於 main 前後,建議前置聲明)
int Show(char *p) {
printf(p);
return 1;
}
// 全局變量(文件作用域)
int global_data; // 未初始化 → BSS 段,歸零
int global_init = 42; // 已初始化 → DATA 段
記憶體佈局速記表
| 區域 | 存儲內容 | 生命週期 | 初始值 | 示例 |
| 代碼段 | 機器指令 | 進程全程 | 只讀 | 函數體 |
| 數據段 | 已初始化全局/靜態變量 | 進程全程 | 程序指定 | int g=1; |
| BSS段 | 未初始化全局/靜態變量 | 進程全程 | 自動歸零 | int g; |
| 堆區 | 動態分配內存 | 程序員控制 | 不確定 | malloc() |
| 棧區 | 局部變量、函數參數、返回地址 | 函數調用期間 | 不確定 | int main(){int a;} |
2. 變量與類型系統
基本類型關鍵字與格式符對照
| 類型 | 關鍵字 | 典型佔用 | printf/scanf | 說明 |
| 字符 | char | 1 byte | %c / %hhd | 有符號性實現定義 |
| 短整型 | short | 2 bytes | %hd | 至少 16 位 |
| 整型 | int | 4 bytes | %d / %i | 自然字長,效率最高 |
| 長整型 | long | 4/8 bytes | %ld | 32位系統常 4B,64位常 8B |
| 長長整型 | long long | 8 bytes | %lld | C99 引入,至少 64 位 |
| 單精度 | float | 4 bytes | %f / %e / %g | ~7 位有效數字 |
| 雙精度 | double | 8 bytes | %lf / %le / %lg | ~15 位有效數字,默認推薦 |
| 長雙精度 | long double | 8/16 bytes | %Lf | 平台相關,x86 常 80 位擴展精度 |
常量字面量後綴規範
123 // int
123L // long
123LL // long long
123U // unsigned int
123UL // unsigned long
033 // 八進制 (27)
0x1F // 十六進制 (31)
3.14f // float
3.14 // double (默認)
3.14L // long double
'a' // char
"hello" // const char* (字符串常量)
sizeof 運算符:編譯期計算類型/表達式佔用字節數
printf("int: %zu\n", sizeof(int));
printf("long: %zu\n", sizeof(long));
printf("pointer: %zu\n", sizeof(void*)); // 32位=4, 64位=8
// %zu 對應 size_t 類型 (C99)
3. 格式化輸入輸出精要
printf 格式化佔位符進階
| 格式 | 含義 | 示例輸出 |
| %d | 有符號十進制整數 | 42 |
| %8d | 寬度 8 右對齊 | " 42" |
| %-8d | 寬度 8 左對齊 | "42 " |
| %08d | 寬度 8 前導零填充 | "00000042" |
| %.3f | 保留 3 位小數 | 3.142 |
| %6.2f | 總寬 6 含小數點,小數 2 位 | " 3.14" |
| %c | 單字符 | A |
| %s | 字符串 | Hello |
| %p | 指針地址 | 0x7ffee3a8 |
scanf 讀取陷阱與對策
- 空白字符處理:
%d %f %s 自動跳過前導空白(空格、換行、Tab)
- %c 不跳過空白:用
" %c"(前置空格)讀取下一個非空白字符
- 返回值檢查:
scanf("%d", &a) == 1 確認讀取成功
- 緩衝區殘留:
scanf("%d", &a) 後緩衝區留有 \n,後續 %c 會讀到它 → 用 getchar() 吞噬或改用 fgets 整行讀取
4. 條件判斷與邏輯控制
運算符優先級與結合性(高→低)
() [] . -> (左→右)
++ -- + - ! ~ * & (type) sizeof (單目,右→左)
* / % (左→右)
+ - (左→右)
<< >> (左→右)
< <= > >= (左→右)
== != (左→右)
& (按位與,左→右)
^ (按位異或,左→右)
| (按位或,左→右)
&& (邏輯與,左→右,短路)
|| (邏輯或,左→右,短路)
?: (三目,右→左)
= += -= *= /= %= &= ^= |= <<= >>= (右→左)
, (逗號,左→右)
短路求值實戰
int a = 0, b = 1, c = 2;
// 邏輯或:a==0 為真 → 短路,不再計算 b==2
if (a == 0 || b == 2) { /* 執行 */ }
// 邏輯與:a==0 為假 → 短路,不再計算 b==2
if (a == 0 && b == 2) { /* 不執行 */ }
// 優先級:&& 高於 ||
if (a == 0 || b == 2 && c == 1)
// 等價於 a == 0 || (b == 2 && c == 1)
switch 語句規範
switch (variable) {
case CONST_EXPR_1:
// code
break; // 必須 break,否則貫穿
case CONST_EXPR_2:
case CONST_EXPR_3: // 多標簽共用代碼
// code
break;
default: // 養成習慣必寫 default
// code
break;
}
允許類型: 整數類型(int, char, short, long, enum),禁止 float/double/string。
5. 循環構造全景
for 循環:已知次數迭代首選
// 標準形式
for (int i = 0; i < 10; i++) {
printf("%d ", i);
}
// 省略初始化/增量(靈活但降低可讀性)
int i = 0;
for (; i < 10; ) {
printf("%d ", i++);
}
// 無限循環慣用寫法
for (;;) { /* ... */ }
while 循環:前置條件檢查
int i = 0;
while (i < 10) {
printf("%d ", i++);
}
do-while 循環:後置條件,至少執行一次
int i = 0;
do {
printf("%d ", i++);
} while (i < 10); // 注意分號
循環控制語句
| 語句 | 作用 | 適用範圍 |
| break | 跳出最近一層循環/switch | for/while/do-while/switch |
| continue | 跳過本次迭代剩餘代碼,進入下一次判斷 | for/while/do-while |
| goto | 無條件跳轉(慎用) | 錯誤處理統一出口、跳出多層循環 |
本課核心知識圖譜
C程序結構
├── 預處理 (#include, #define, #ifdef)
├── main入口 (int main(void))
├── 變量聲明 (類型、作用域、存儲類別)
├── 函數調用 (庫函數、自定義函數)
└── 代碼塊 ({ })
數據類型
├── 基本類型 (整數、浮點、字符)
├── 構造類型 (數組、結構體、聯合、枚舉)
├── 指針類型
└── void 類型
控制流
├── 順序結構
├── 選擇結構 (if, if-else, switch)
└── 循環結構 (for, while, do-while)
├── break/continue
└── 短路求值 (&&, ||)
這一課鋪墊了 C 語言 80% 的日常編程詞彙。建議按「敲碼→跑通→改錯→背誦範式」四步法內化每個代碼模板,為後續指針、內存管理、文件操作、模組化開發打下鋼鐵般的基礎。