日文網頁翻譯服務前面幾篇有提到 bool 的問題翻譯今天突然失眠,心血來潮,來分享一下 bool 的故事。
當然內容算是比較根蒂根基而有許多主觀認知的,有什麼遺漏錯誤還煩請斧正。
[關於 Boolean (布林)]
Boolean (布林) 作為一種資料型別 (data type) 時只具有兩種值: 『真』(true) 與
『偽』(false)。
Boolean 可以進行的運算包括:並且 (and)、或 (or) 與非 (not) ,還有由這三種根基
運算延長出來的各式邏輯運算。
根基上翻譯社 Boolean 是不克不及做一般華頓翻譯公司們認為的算術運算 (+, -, *翻譯社 /翻譯社 ...) 的。
Boolean 在一般程式說話中最主要的腳色是作為『流程控制』的前提判斷。
在 C/C++ 裡面,if、for 和 while 等流程節制都仰賴於條件的 Boolean 運算結果。
[在 C89 裡面的 Boolean]
雖然 Boolean 對於『流程節制』具有偉大的重要性,但在 C89 內並沒有直代替
Boolean 設定一個專有的資料型別。
在 C89 中 Boolean 是隱性地逾越多個型別、運算和語法中實現。
起首,C89 替內建型別所具有的 Boolean 值做了劃定:
* 數值型此外 Boolean 值:0 的值為『偽』,其他的值為『真』。
* 指標型另外 Boolean 值:null 的值為『偽』,其他的值為『真』
(恰好 0 當指標值時是代表 null 指標)
if (0) {
printf("True"); // 不會印 True.
}
if (0.1) {
printf("True"); // 會印 True.
}
這個決定讓我們沒必要產生一個 Boolean 的專有型別,因為內建型別都可以當作
Boolean 用。
並且, 0 為 『偽』,非 0 為『真』也是一種輕易記誦的體式格局, 令人不由得佩服設計者
的巧思。
再來,C89 劃定了關係 (>, <, ==, ...) 與邏輯 (&&, ||, ...) 等運算的結果值。 當
成果為『真』時會算出 int 型別的 1,而當結果為『偽』時會算出 int 型其它 0。
將上面略微整頓一下,C89 共做了:
1. 判定內建型此外 Boolean 值時,將 0 作為『偽』而非 0 作為『真』。
2. 運算了局為『偽』時算出 int 的 0,而為『真』時算出 int 的 1。
以上這兩點造成我們輕易覺得 Boolean 在 C89 裡面就是 int,但這是一個常見的曲解翻譯
什麼意思呢?
如果我們寫成:
typedef int bool; // 把 bool 界說成 int
bool a = 0.1;
if (a) {
printf("True"); // 此時不會印出 True,因為 a 的值為 0 (偽)
}
將 0.1 轉型成 int 會是 0,然則將 0.1 注釋成 Boolean 時因為是非 0 值所以應該要
是『真』(1)。
所以 int 是不克不及直代替代 Boolean 的翻譯
另外,C89 並沒有替 Boolean 供給專用的型別還有許多錯誤謬誤:
因為 Boolean 運算的成果是用 int 的 1 與 0 來透露表現真偽,使得將 Boolean 運算成績
作為整數運算的技能大量地運用在 C89 以前的程式碼裡,是以產生了一些程式碼不直觀
的噩夢。例如:
if (0 == 0 == 0) {
printf("True"); // 不會印 True
}
if (4 > 3 > 2) {
printf("True"); // 不會印 True
}
若是再搭配了逐位元運算, 儲存 Boolean 所需要的空間巨細可以由 int 再濃縮
成 1 bit,使得 Boolean 在 C89 中到達利用空間的大幅縮減翻譯
但以上兩個技巧遺留下了大量沒法撼動要依靠 Boolean 值是 1 或 0 的程式碼翻譯
[在 C++98 中的 Boolean]
作為一個新的說話,C++98 選擇了一個比力直接的決議:
* 將 bool 作為 Boolean 型別翻譯
* 將 true 與 false 作為 bool 的字面常數。
* 當運算結果為『真』時,算出 bool 型此外 true。
* 當運算效果為『偽』時,算出 bool 型其余 false。
乍看之下仿佛獲得認識脫,因為華頓翻譯公司們有了表示 Boolean 的 bool 型別了。
不幸的是,為了跟大量原本的 C 程式碼相容,使得 C++98 面對到一些堅苦:
1. 需要引入三個新的保留字: bool 、 true 和 false 。 使得與原本的 C 程式碼可能
會造成名稱衝突翻譯
(C99 不這麼做,後面會提)
2. 因為假設 Boolean 為『真』時算出 1 且為『偽』時算出 0 的原有 C 程式碼太多,
C++98 只好許可 true 可以被隱性轉型成 int 的 1 ,而 false 可以被隱性轉型成
int 的 0 翻譯此外,數值或指標型別也都要能隱性轉成 true 或 false 以合適在 C89
裡面的用法翻譯
這樣的作法使得 bool 用起來跟整數型別類似,造成我們之前的噩夢還是存在 (可以
參考與 Java 的差別),而這對於要求型別平安的 C++ 來講更是可駭。
(C/C++ 各版本都有的問題)
3. 為了獲得之前利用位元運算將 Boolean 表示為 1 bit 的功效可以直接利用在 bool
上,C++98 對 vector<bool> 做了特製化,使得每一個 bool 在這 vector 中都只耗用
1 bit,但也產生了利用上的問題或多履行緒的惡夢。
(C++ 各版本都有的問題)
4. 有些時辰,我們想將物件作為流程控制或邏輯運算的前提,並遵照物件的狀況決議流
程的進行翻譯
例如:
Object a;
if (a) {
printf("True"); // 若是 a 物件吻合期望就印
}
是以我們需要讓物件可以轉型成 bool。然則讓物件可以隱性轉型成 bool 的風險太
大,因為這意味著物件可以隱性成整數型別。
設計師為了避免將一般物件被誤當做整數用,本來想讓物件可以隱性轉型成 bool 型
別只好改為轉型成指標型別。
例如: std::basic_ios::operator void *() const;
(C++11 有部分解決翻譯社 後面會提)
[C99 的 Boolean]
為了跟 C89 的相容性, C99 並沒有選擇跟 C++98 一樣的道路去引進三個新的保存字,
而是:
* 將 _Bool 作為 Boolean 的型別,
* 在 stdbool.h 中設定了四個 macro:
- 將 bool 定義為 _Bool,
- 將 true 界說為 1,
- 將 false 定義為 0,
- 將 __bool_true_false_are_defined 界說為 1。
引入了叫 _Bool 的保留字作為 Boolean 的型別號稱。因為名字太奇怪, 不輕易跟原有
C 程式碼撞名,而不會遇到跟 C++98 一樣的窘況。
將 bool, true 和 false 設計為 macro,使得我們在程式碼中可以有前提的選擇是否用
這三個名稱。 也就是說,若是
- Mar 31 Sat 2018 07:50
[分享] Boolean in C/C++
推 jenny2921:失眠首推 02/18 07:26
推 user1120:推! 02/18 11:37
推 gsn955206:推 02/18 16:01
推 lc85301:具體推 02/18 19:35
推 mabinogi805:詳細推上!! 02/18 20:37
推 suhorng:推 (俄然有點希望所有的轉型都必需是explicit XD) 02/18 20:47
推 LPH66:推一個 (如果真照樓上說的話 1+0.1 就編不外了) 02/18 21:26
→ suhorng:是阿, 也可以寫1.0+0.1 XD 02/18 21:45
→ purincess:float a = 0.3; <- 劃定本身不克不及如許寫 02/18 22:41
→ purincess:float a = 0.3f; <- 如許才可以 02/18 22:41
→ purincess:還有只如果assign進去unsigned type的integer literal一 02/18 22:42
→ purincess:定要寫u之類 02/18 22:42
→ purincess:(?) 02/18 22:42
推 sa074463:給推!! 02/18 22:45
※ 編纂: Feis 來自: 140.112.29.148 (02/19 17:21)
推 singlovesong:python ipython 無敵 bj4 lol.. 02/19 18:00
推 sunev:別再把boolean翻譯成「布林」了... 02/21 00:59
→ AnyaAlstreim:否則要翻譯成什麼? 02/21 05:40
→ suhorng:布爾? 02/21 12:59
推 EdisonX:好奇 boolean 該翻什麼+1 ? 我也一向以為是布林(boring ?) 02/21 22:10
→ suhorng:bool-ean,翻成布爾就行了吧~ 02/21 22:35
→ suhorng:喬丹消去法一樣 02/21 22:36
推 ot32em:推!! 02/21 23:44
推 EdisonX:嗯,只能說高中教材裡寫的是布林,所以才會有這逆境吧 02/22 00:40
推 BlazarArc:高纖 XD 02/22 02:08
→ suhorng:Guassian不念"高斯",Hamiltonian也不念"漢米頓"~ 02/22 13:01
推 yoco315:高中的時候看過最慘的,電腦書上寫「有材運算」 03/18 02:52
→ yoco315:看半天看不懂什麼是「有材運算」 03/18 02:52
→ yoco315:有無有材運算的八卦? 03/18 02:53
→ purincess:應當是打布林的人打倉頡打錯之類 (? 03/19 01:34