| 特性 | 單引號 'c' | 雙引號 "c" |
|---|---|---|
| 類型 | int (字元常數) | const char* (字串常數) |
| 值 | ASCII/編碼對應的整數值 | 指向唯讀記憶體區塊的指標 (含結尾 \0) |
| 大小 | sizeof('c') == sizeof(int) (通常 4 bytes) | sizeof("c") == 2 (字元 + \0) |
| 可修改性 | 不可修改 (常值) | 指向不可修改區域,嘗試修改導致 UB |
// 錯誤:雙引號比較
if (str[k] != ".") { ... } // 永遠為真!比較 char 與 char*
// 正確:單引號比較
if (str[k] != '.') { ... } // 比較 char 與 char (整數值 46)
'A' --> 整數 65 (0x41)
"A" --> 位址 0x1000
0x1000: 'A' (0x41)
0x1001: '\0' (0x00)
switch(ch) { case 'a': ... }:字元判斷必用單引號。printf("Hello"):字串字面值用雙引號。char c = 'a'; vs char *s = "a";:前者儲存字元值,後者儲存指標。strlen("abc") == 3,sizeof("abc") == 4。'c' 型別為 int,值為執行字元集對應編碼。"..." 型別為 char[n] (n = 長度+1),靜態儲存期,修改行為未定義。'ab' 為實作定義 (int),可移植性差,避免使用。單引號 = 整數值 (字元編碼),**雙引號 = 指標 (指向以 \0 結尾的字元陣列)**。混用會導致邏輯錯誤 (如字元比較永遠真/假) 或型別不匹配警告。牢記此區別,可避免大量低級 Bug。