已知
s是字符型變量 (char),下列賦值語句正確的是?A. s = 'abc'; B. s = '\08'; C. s = '\xde'; D. s = "\";
| 選項 | 代碼 | 合法性 | 詳細解析 |
|---|---|---|---|
| A | s = 'abc'; | ❌ 非法 | 單引號內只能包含單個字符;'abc' 是多字符常量,C 標準規定其值與實現相關,且不能賦給 char (通常會截斷並警告)。 |
| B | s = '\08'; | ✅ 合法 | \0 是八進制轉義,表示空字符 (ASCII 0);後面的 8 是普通字符 '8'。整個常量等價於 '8' (ASCII 56),完美適配 char。 |
| C | s = '\xde'; | ⚠️ 合法但有風險 | \xde 為十六進制轉義,值為 222 (0xDE)。若 char 為有符號 (典型範圍 -128~127),222 會溢出為 -34 (實現定義行為);若為無符號 (0~255) 則正常。賦值語法合法,但數值含義依賴 char 符號性。 |
| D | s = "\"; | ❌ 非法 | 雙引號表示字符串字面量 (類型 const char*),指向內存中以 \0 結尾的字符數組,不能賦給 char 變量。若意圖賦反斜桿字符,應寫 s = '\\\\'; (雙重轉義)。 |
' ' → 字符常量,類型 int (C89) / char (C++), 值為單字符編碼。" " → 字符串字面量,類型 const char*,指向只讀內存區。\ooo (1-3 位八進制) 如 \0、\101 ('A')\xhh (1-2 位十六進制) 如 \x41 ('A')、\xde\n \t \\ \' \" 等常用轉義char 符號性:C 標準未規定 char 是否帶符號,由編譯器決定 (x86 通常有符號,ARM 常無符號)。跨平台代碼涉及 >127 數值時,顯式使用 signed char 或 unsigned char。正確選項:B
理由:
'\08'解析為字符'8'(ASCII 56),完美適配char範圍,語法合法、語義明確、無溢出風險。
char c1 = 'A'; // 65
char c2 = '\101'; // 八進制 101 = 65 'A'
char c3 = '\x41'; // 十六進制 41 = 65 'A'
char c4 = '\n'; // 換行符 10
char c5 = '\\'; // 反斜桿 92 (需轉義)
unsigned char c6 = '\xde'; // 明確無符號,值 222 安全
signed char c7 = '\xde'; // 明確有符號,值 -34 (實現定義)
判斷字符賦值合法性,關鍵看三點:
signed char -128~127, unsigned char 0~255)。選項 B 滿足所有條件,為唯一完全正確的賦值語句。