close

代辦公證服務前面幾篇有提到 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. 運算效果為『偽』時算出 int0,而為『真』時算出 int1翻譯 以上這兩點造成我們輕易感覺 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 運算的後果是用 int10 來示意真偽,使得將 Boolean 運算結果 作為整數運算的技能大量地運用在 C89 之前的程式碼裡,是以產生了一些程式碼不直觀 的噩夢。例如: if (0 == 0 == 0) { printf("True"); // 不會印 True } if (4 > 3 > 2) { printf("True"); // 不會印 True } 如果再搭配了逐位元運算, 貯存 Boolean 所需要的空間巨細可以由 int 再濃縮 成 1 bit,使得 Boolean 在 C89 中到達利用空間的大幅縮減。 但以上兩個技能遺留下了大量沒法撼動要依靠 Boolean 值是 10 的程式碼翻譯 [在 C++98 中的 Boolean] 作為一個新的說話,C++98 選擇了一個對照直接的決意: * 將 bool 作為 Boolean 型別。 * 將 truefalse 作為 bool 的字面常數翻譯 * 當運算了局為『真』時,算出 bool 型其余 true。 * 當運算了局為『偽』時,算出 bool 型其它 false。 乍看之下仿佛獲得領會脫,因為我們有了透露表現 Boolean 的 bool 型別了。 不幸的是,為了跟大量原有的 C 程式碼相容,使得 C++98 面對到一些堅苦: 1. 需要引入三個新的保留字: booltruefalse 翻譯 使得與原有的 C 程式碼可能 會造成名稱衝突。 (C99 不這麼做,後面會提) 2. 因為假定 Boolean 為『真』時算出 1 且為『偽』時算出 0 的原有 C 程式碼太多, C++98 只好許可 true 可以被隱性轉型成 int1 ,而 false 可以被隱性轉型成 int0 。另外,數值或指標型別也都要能隱性轉成 truefalse 以合適在 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, truefalse 設計為 macro,使得我們在程式碼中可以有條件的選擇是不是用 這三個名稱。 也就是說,假如翻譯公司不 #include <stdbool.h> 的話,booltruefalse 預設是不決義的。如許可以免跟原有程式碼撞名,或有需要時做一些處置。 此外,你可以發現,因為是利用 macro,Boolean 運算的成果仍然是 int 型態,這點使 得一般的運算成果跟 C89 是一致的翻譯 換句話說,C99 解決 C89 問題的作法是供應的一個真實的 Boolean 型別, 但是其他都 沒有真的改翻譯_Bool 的用處首要是讓方才毛病的程式碼正常履行: _Bool a = 0.1; // a 會是『真』而不是 0 if (a) { printf("True"); // 會印出 True } [C++11 的 Boolean] C++11 的 bool 大致上依循 C++98 的腳步,但多了一點調劑: 之前我們不敢讓物件隱性轉型成 bool ,因為怕被誤當作整數用。可是目下當今我們可以用 C++11 的 explicit cast operator 來讓物件只能顯性轉型成 bool。 explicit cast operator 的意思是,原本我們在類別裡面自定的轉型運算子不能被指定 為只提供顯性轉型。也就是: class Object { operator bool() const; // 轉型成 bool 的運算子 }; 提供上面的轉型運算子意味著: Object a; a + 1; // 是合法的,a 會被隱性轉型成 bool 後轉型成 int 運算 這樣並不好,讓物件可以當整數用簡直是惡夢! 我們可以使用 C++11 供應的 explicit cast operator 劃定我們利用轉型運算子時需要 是顯性的: class Object { explicit operator bool() const; }; 假如對這個種別利用之前的程式碼: Object a; a + 1; // 編譯失敗,因為 a 無法隱性轉型成 bool 或整數 當我們真的需要將 a 轉型成 bool 時需要使用顯性轉型: Object a; if ((bool)a) { // 顯性轉型成功 printf("True"); } 但是這樣用起來又有點麻煩,所以 C++11 讓流程控制或邏輯運算時的條件具有顯性轉成 bool 的語意 (其他時候則不會)。 換句話說,在 C++11 裡面翻譯社 Object a; if (a) { printf("True"); } 會自動解釋成 Object a; if ((bool)a) { printf("True"); } 這樣就達到讓物件要轉型成 bool 需要是顯性的, 但是利用在邏輯運算或做流程節制 時,又不需要一向寫顯性轉型的程式碼。 然則其他的時辰,因為 a 不克不及被隱性轉型成 bool,而得到更多的型別平安翻譯 -- 以上.. 寫得很主觀, 細節沒細心查證翻譯社 應當也有良多疏漏的. 歡迎與感激各人的意見... --

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:樓上讓我想到我曾想劃定自己寫超嚴謹的C,例如 02/18 22:41
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:然後結論是: 還好我現在工作大多用python... 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:就像鉦昱翻譯公司們不會把 Gaussian-Jordan elimination 翻成高纖 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
suhorng:Boolean原本就不唸布爾。 02/22 13:01
yoco315:高中的時辰看過最慘的,電腦書上寫「有材運算」 03/18 02:52
yoco315:看半天看不懂什麼是「有材運算」 03/18 02:52
yoco315:有沒有有材運算的八卦? 03/18 02:53
purincess:應當是打布林的人打倉頡打錯之類 (? 03/19 01:34


文章來自: https://www.ptt.cc/bbs/C_and_CPP/M.1392678898.A.DA5.html有關各國語文翻譯公證的問題歡迎諮詢鉦昱翻譯公司02-23690937

arrow
arrow
    文章標籤
    翻譯社
    全站熱搜
    創作者介紹
    創作者 dannyky762l 的頭像
    dannyky762l

    dannyky762l@outlook.com

    dannyky762l 發表在 痞客邦 留言(0) 人氣()