核心區別一覽
| 特性 | 單引號 ' ' | 雙引號 " " |
| 代表意義 | 字元常量 (單一字符) | 字串常量 (字符序列) |
| 類型 | int (C 語言中字元常量類型為 int) | char * (指向首字符的指標) |
| 佔用內存 | 通常 4 位元組 (int 大小) | 長度 + 1 (結尾隱含 \0) |
| 合法內容 | 僅 1 個字符 (或轉義序列如 '\n') | 0 或多個字符 |
| 範例 | 'A', '1', '\n', '\\' | "A", "Hello", "", "\n" |
| sizeof 結果 | sizeof('A') == sizeof(int) (通常 4) | sizeof("A") == 2 (含 \0) |
常見錯誤與修正
錯誤 1:字串比較用單引號
// 錯
if (str == 'hello') { ... }
// 對
if (strcmp(str, "hello") == 0) { ... } // 需用 strcmp 比較內容
錯誤 2:字元賦值用雙引號
// 錯
char c = "A"; // 警告:指標轉整數,實賦值位址
// 對
char c = 'A'; // 正確賦值 ASCII 65
錯誤 3:switch case 標籤用雙引號
// 錯
switch(c) { case "A": ... } // case 標籤必須是整數常量表達式
// 對
switch(c) { case 'A': ... }
錯誤 4:printf 格式字串混淆
// 輸出單字元
printf("%c\n", 'A'); // 正確
printf("%s\n", "A"); // 也能輸出 A,但語義不同 (字串)
// 輸出字串
printf("%s\n", "Hello"); // 正確
// printf("%c\n", "Hello"); // 錯誤:%c 期望 int,傳入指標 -> 未定義行為
記憶體佈局圖解
字元常量 'A' (int, 立即值/寄存器/常數區):
+------+
| 65 | (ASCII 碼值)
+------+
字串常量 "A" (唯讀數據段):
+------+------+
| 'A' | '\0' | 連續兩字節,首地址類型 char*
+------+------+
進階:多字符常量 (非標準/實現定義)
int x = 'AB'; // 實現定義行為,通常打包為 ( 'A' << 8 ) | 'B' = 0x4142
// 避免使用,可移植性極差
總結口訣
- 單引號:一個字符,值語義 (
int),用於字元操作、switch case、字元比較。
- 雙引號:一串字符,址語義 (
char*),用於字串輸出、strcpy/strcmp、字串字面值。