為什麼 C++ 不定死 bool 的大小?char 為何有三種?double 類型字面量如何書寫?標識符命名規則有哪些?

  1. 為什麼 C++ 規定 bool 的最小尺寸未定義?為什麼不直接規定最小尺寸為 1 位?規定為未定義有什麼特殊含義?

  2. char 和 signed char 有哪些區別?為什麼會有這些區別?為什麼其他內置類型如 int,分為 unsigned int 和 int 兩種,而 char 分為 char、signed char、unsigned char 三種?

  3. 0. 和 .001 是 float 型還是 double 型的?為什麼可以這麼省略?
  4. C++ Primer 第五版中文版中說定義在函數體外的標識符不能以下劃線開頭。我在 main 函數外面定義了一個int _e = 2; 卻並沒有報錯。習題 2.12 中 int _; 這個題目有人認為該名字是合法的,為什麼?


我可能就是你所說的 「github上那個人」,所以不邀自來,試著回答一下。

1. 所有C++中類型,必須 addressable 的。你說為何不是 1 bit,試著想想你如何用指針去指向 1 bit ? 你至少也只能指向 1 byte (8bit). 所以, 1 byte 才是最小可接受的尺寸。bool 只有兩個值,true or false, 按理說 1 bit 就夠了,但因為上面的原因,至少也要 1 byte, 但因為 CPU 的架構各有不同,有些處理 4 byte 要比 1 byte 還快,所以 C++ 標準里才向來沒有對 bool 的 size 做硬性要求,取決於編譯器的優化策略。GCC 上可能 size 為 1 byte (與 char 一致), 到 VS 上可能就是 4 byte (與 int 一致)。

2. 實際上 char 也只有兩種表現形式:signed 和 unsigned. 而(plain) char 為依照編譯器的具體實現來確定自己到底是 signed 還是 unsigned. 出於跟第一個問題類似的考慮,char 的不確定性也是因為不同平台不同機器的策略而形成的。(實際上,如果沒有 signed char 這個類型, signed 關鍵字甚至都沒有太多理由存在了。見我的另一篇小文 被人忽略的 signed 關鍵字)

以上兩個問題,實際上都是對於 C++ 標準中的一些規定的疑問,如果說標準是 C++ 語言的邊界,那麼你問為什麼標準這樣規定,就超出了 C++ 語言的範疇,需要學習編譯原理體系結構,甚至操作系統,去進一步了解。

3. 默認都是 double。這個書上原話,(抱歉,我沒有中文版):

3.14159 3.14159E0 0. 0e0 .001

By default, floating-point literals have type double.

你說有答案寫了 float , 請問具體哪道題?如果針對習題答案有疑問,可以直接發 Issue。

4. 這個問題可以參考 關於C++中的下劃線? 看起來是翻譯錯誤。因為英文版說的是:

In addition, identifiers defined outside a function may not begin with an underscore.

只能說,那樣做不是一個好習慣。但並不意味著那不合法。這一小節開頭就有這句話:

Identifiers in C++ can be composed of letters, digits, and the underscore character.

所以那道題是被認為合法的。

你看書看的非常細緻,以後有疑問去 GitHub 上提,如果習題答案有疏漏的地方,希望也能貢獻你的力量。謝謝~


1. 因為它喜歡。

2. char可能是有符號或者無符號的。

3. 是的,因為它喜歡。float要加後綴f或者F。

4. 「有外部鏈接」的標識符不能以一個下劃線開頭,因為這是保留給標準庫的。我還真遇到過衝突的情況。


回答一下第四問。有時一些方法會返回一些你不感興趣的值,這時你可以用"_"去接收這個值。用它去表示一切你不關心的對象。簡單地說, 它非要一個名分,那就給他一個"_"就好 了。


推薦閱讀:

為什麼知乎上大多數人不推薦C語言入門?
怎樣深入學習操作系統?
Coursera (或其它慕課平台)上有哪些編譯原理相關的課程值得推薦?
根據語義生成圖像的相關研究工作有哪些?
博士做研究如何選擇方向?

TAG:編程 | 計算機科學 | C | CPrimer |