C++ 的 char 和 string 是兩個世界,引號不能混用
在 JavaScript 裡,單引號
'a'和雙引號"hello"本質上都是字串型別(String,JS 沒有獨立的字元型別)。C++ 不是這樣——char和string是完全不同的兩個世界,而引號決定你拿到哪一個。
| 特性 | char | std::string |
|---|---|---|
| 引號規定 | 嚴格使用單引號 'a' | 嚴格使用雙引號 "a" |
| 本質 | 基本型別(primitive) | 標準庫物件(class object),本質是動態包裝的 char 陣列(底層類似 vector<char>) |
| 記憶體大小 | 固定 1 byte | 動態配置(標頭約 24~32 bytes + 字元內容) |
| 能裝什麼 | 恰好一個字元(底層是 ASCII 數字) | 0 到幾百萬個字元,長度動態調整 |
| 常用場景 | 單一字元比對、計數陣列的索引 | 傳遞單字、整體比對、串接文字 |
| JS 對照 | 無(要用長度為 1 的字串模擬) | String |
char c = 'a'; // 正確:單引號,單一字元
string s = "a"; // 正確:雙引號,長度為 1 的字串
char error1 = "a"; // 編譯錯誤!雙引號是 string(const char*),塞不進 char
string error2 = 'a'; // 編譯錯誤!不能直接把 char 當成 string 賦值兩個型別不能互相賦值,連「長度為 1 的字串」和「一個字元」都不行。這是從 JavaScript 轉 C++ 最先撞到的一道牆。
char 之所以能當計數陣列的索引,見 C++ 的 char 本質是小整數;string 能被原地修改的性質見 C++ 的 string 可以用索引原地修改,JS 的字串不行。