整理 C 語言入門十大核心問題,涵蓋語言分層、歷史、編譯流程、常數類型、巨集與變數差異,適合初學者建立正確心智模型。
機器指令:二進位機器碼(如 00000010)。
機器語言:指令集合,CPU 型號不同指令集不同。
符號語言(組合語言):用助憶符號(ADD A,B)取代機器碼,需組譯器轉機器碼。貼近硬體、不可攜帶,稱低階語言。
高階語言:不依賴特定機器,符合人類思維(如 printf),需編譯器轉機器碼,一行對應多條機器指令。
// 註解、stdint.h、VLA 等)nullptr、typeof 等)#include <stdio.h>?C 本身無 I/O 語句,標準庫提供 printf/scanf 等函數,原型宣告於 stdio.h。#include 將標頭檔內容展開至原始檔,使編譯器知曉函數簽名。
main 為何這樣寫?int main(void) { return 0; }
int 回傳值:C99 建議明確宣告;0 代表成功,非 0 代表失敗(錯誤碼可區分失敗原因)。void 參數:明確表示不接受命令列參數。編譯器單次掃描,呼叫前未見定義會報錯 identifier not found。解決:
1. 函數原型前置宣告
2. 定義提前至呼叫之前
3. 將原型置於標頭檔 .h,#include 引入
.c 編譯產出 .obj/.o(目標檔),含機器碼但符號未解析。libc)連結。1, 55, 0xFF50.2, 78.34e4'a', '\n', '\033' (八進位), '\x1B' (十六進位)"hello"(以 \0 結尾)#define PI 3.14159const 限定變數:const double PI = 3.14159;#define vs const 差異?| 特性 | #define PI 3.14 | const double PI = 3.14; |
|---|---|---|
| 本質 | 前處理器文字替換(符號常數) | 唯讀變數(有型別、有位址) |
| 記憶體 | 不佔用(編譯期替換) | 佔用資料段記憶體 |
| 型別檢查 | 無 | 有 |
| 除錯 | 符號表無 PI,難除錯 | 可在除錯器檢視 |
| 作用域 | 檔案級(無視區塊) | 遵循區塊作用域規則 |
建議:現代 C/C++ 優先用 const 或 constexpr(C++),僅在條件編譯、字串化、拼接等前處理器專屬場景用 #define。