... <看更多>
Search
Search
#1. 怎麼表示是非對錯? 在C 與C++ 中布林(Boolean) 型態的演進(三)
布林代數(Boolean algebra),或稱布爾代數/邏輯代數,具有『真』(true) 與『偽』(false) 兩種值,可用來表示是非對錯的概念。在程式語言中,各種程式 ...
有人說c語言中沒有bool型別,只有c 中有,果真如此? 先看沒有bool型別時,c中表示bool型別的方法: 1、 typedef int bool; #define false 0 #define ...
C++ bool 型別 · bool型別的變數只能儲存0或是1而且bool資料型別只使用一個位元組。 · using namespace std; · int main() · bool bt = true; · cout << "sizeof ...
寫java程式碼時間久了再寫c的程式碼,發現思維很容易混亂,寫c++的時候也容易混亂,今天用c語言想輸出bool型的值,居然用java的方法直接輸出,結果 ...
#5. bool (C++) | Microsoft Docs
將後置或前置 ++ 運算子套用至類型的變數時 bool ,變數會設為 true 。 Visual Studio 2017 15.3 版和更新版本: bool 已從語言中移除,且已不再支援 ...
布林(英語:Boolean)是電腦科學中的邏輯資料型別,以發明布林代數的數學家喬治· ... C++程式語言在其標準化過程中引入了 bool 、 true 和 false 關鍵字,增加了原生 ...
#7. C 速查手冊- 6.5.2 布林函數 - 程式語言教學誌
所謂的布林函數(Boolean function) 是指傳回真假值的函數(function) ,由於C 語言中運算式(expression) 結果為0 就表示假(false) ,非0 值就表示真(true) ,所以當函數 ...
#8. C語言宣告boolean的型態- 藍色小舖BlueShop
C++ 有bool, true, false 這三個關鍵字. C99 語言標準新增了_Bool 這個關鍵字, 它是個類型. C99 也增加了<stdbool.h> 這個頭檔 ...
#9. C 语言的布尔类型(true 与false) | 菜鸟教程
我们可以借助C 语言的宏定义来哦设置:. //宏定义布尔类型 #define BOOL int #define TRUE 1 #define FALSE 0 //定义一个布尔变量 BOOL flag = FALSE;.
#10. C/C++ 的布林類型(bool: true & false) - jashliao部落格
C/C++ 的布林類型(bool: true & false) ... 宏定义布尔类型#define bool int #define true 1 #define false 0 //定义一个布尔变量BOOL flag = false;.
#11. 布林值(bool) - 岳程式與鍵盤間的故事
在別的程式語言裡面,int 或string 是可以轉換為bool 的,例如: C++:只要數值非零,皆為true。(C++ 不熟...其他型態沒試過)
#12. 【C++】bool(boolean) 函式的C語言 - 程式人生
我想在C語言中使用bool(boolean) 首先我在C++中看到 int maximum(int state, **bool choose**); 然後 new_state = maximum(now_State, **true**);
#13. C語言bool類型 - 台部落
也許很多人都和我一樣,不知道現在的C語言已經有了布爾型:從C99標準開始,類型名字爲“_Bool”。 在此之前的C語言中,使用整型int來表示真假。
#14. 第十六章邁向C++ 之路
把原先從C語言移植到C++ 的函數庫,在其標頭檔名稱之前. 加上小寫的字母c。 ... C++ 有bool 型態,C 則沒有. ○ 布林(boolean)型態的值只有true 和false 兩種.
#15. C++ 中建立布林函式
布林函式表示返回 bool 型別值的函式。布林函式的結構可以和其他函式一樣。在下面的例子中,我們實現了一個比較兩個字串大小的 ...
#16. [C 語言] 程式設計教學:資料型態(Data Type) - 技術文件
C 語言 的資料型態 · 布林數(boolean) (C99) · 整數(integer) · 浮點數(floating-point number) · 複數(complex number) (C99) · 字元(character) · 列舉(enumeration).
#17. [分享] Boolean in C/C++ - 看板C_and_CPP - 批踢踢實業坊
Boolean 在一般程式語言中最重要的角色是作為『流程控制』的條件判斷。 在C/C++ 裡面,if、for 和while 等流程控制都仰賴於條件的Boolean 運算結果。
#18. 在C ++中將布爾轉換為文本(Converting bool to text in C++)
如何使用C ++語言本身? bool t = true; bool f = false; std::cout << std::noboolalpha << t << " == " << std::boolalpha << t << std::endl; ...
#19. C語言BOOL值與零值判斷的問題 - 好問答網
C語言BOOL 值與零值判斷的問題,1樓匿名使用者if flag true if flag 1 if ... boolean型別是c++所獨有的,其別名有bool 和bool,都可以定義布林變數。
#20. 一起幫忙解決難題,拯救IT 人的一天
開始,型別名字為 _Bool 。 另外,C99 為了讓C 和C++ 更相容,增加了一個標頭檔案 stdbool.h 。裡面定義了 bool 、 true 、 false ,讓我們可以像C++ 一樣的定義布林型 ...
#21. C语言中有没有bool类型? - CSDN博客
C语言 并非没有bool类型,而是在C99标准之前没有。C99标准中新增的头文件中引入了bool类型,与C++中的bool兼容。该头文件为stdbool.h,其源码如下所示:.
#22. C++ 快速導覽- 邏輯運算 - 程式語言教學誌
以下為邏輯「非」的例子 #include <iostream> int main(void) { bool a = false; int b = 0; double c = 0.0; std::cout << a << std::endl; std::cout << !a ...
#23. C++布尔类型(bool) - C语言中文网
bool 类型只有两个取值,true 和false:true 表示“真”,false 表示“假”。 bool 是类型名字,也是C++ 中的关键字,它的用法和int、char、long 是一样的,请看下面 ...
#24. [分享] Boolean in C/C++ - williesilgd - 痞客邦
印度文口譯工作前面幾篇有提到bool 的問題翻譯今天忽然失眠,血汗來潮, ... 在C/C++ 裡面,if、for 和while 等流程節制都仰賴於前提的Boolean 運算成績。
#25. 布林運算 - C++語言自學手冊
在前面變數-Bool 布林值 時有提過:0代表False;1代表True。 而在這裡還要再補充一點:只要不是0,就是真。例如:. 1. bool b1 = 2;. 2. bool b2 = -1;.
#26. 有些函式並不傳回值,這些函式必須宣告為void函式 - C/C++
bool 資料型別只有兩種變數值:true和false。使用bool傳回值可用於判斷函式執行的結果為true或false。範例程式6-8就是使用bool傳回值的函式例子。
#27. bool 與BOOL · KKBOX iOS/Mac OS X 基本開發教材
Objective-C 語言是在C 語言的基礎上,又加了一層物件導向與動態語言特性的語言,很多基本型別是 ... 那麼,Objective-C 的BOOL,與C99 以及C++ 的bool 有什麼差別呢?
#28. C語言中bool變量的深入理解 - WalkonNet
前言; bool類型變量的大小; bool 值與0比較; c語言中bool如何輸出; 總結 ... 但是c99引入瞭_Bool類型(_Bool就是一個類型,不過在新增頭文件stdbool.h ...
#29. bool傳回值
bool is_upper(char c); //宣告函式原型,傳入char參數,傳回值資料型別是bool. void main( ). {. bool b;. char c;. cout<<“輸入一個字元 :";.
#30. C語言bool型別 - w3c學習教程
C語言bool 型別,c語言裡面是沒有bool 布林型別的,c 裡面才有,這就是說,在c 裡面使用bool型別是沒有問題的。bool型別有隻有兩個值true.
#31. C語言BOOL判斷式問題/ C++ / 程式設計俱樂部
不好意思,我學的比較淺,想請問說之前看書上說C語言不認識BOOL,但之前有看到其他程式C語言一樣可以做true和false的敘述判斷。 這題題目是:輸入一整數,判斷是否為3 ...
#32. C語言中有bool型別嗎? - w3c菜鳥教程
C語言 中有bool型別嗎?,之前一直都沒有注意到,最近在用c語言寫dsp演算法時,偶然間發現我函式中定義的bool型別的變數在vc6 0 我主要用它來檢查一下 ...
#33. bool變數的介紹以及應用【C語言】 - tw511教學網
bool 變數的介紹以及應用【C語言】. 2020-08-11 22:40:34. 標頭檔案參照 #include<stdbool.h>. 型別BOOL,它具有YES值和NO值True 代表1 False代表2.
#34. Linux下C語言編譯器gcc不認識bool類型的問題 - 開源互助社區
得到回復,總結於下: C語言(或C++)里本身沒有bool這種布爾類型。有些編譯器可以識別,那也是因為編譯器自己定義了bool類型,比如:#define bool int。 C語言里,一般用 ...
#35. C語言裡面有BOOL型別嗎,具體又怎麼用它呢
C語言 裡面沒有BOOL型別的,BOOL型別只有C++才有。可以用int類表示,或者將BOOL定義為int. typedef int BOOL; ...
#36. 一、依據下方C 語言程式碼,請完成ㄧ布林(Bool)型態之函式 ...
一、依據下方C 語言程式碼,請完成ㄧ布林(Bool)型態之函式Triangle( ),並填寫呼叫此一函式之程式碼。此一函式參數包含整數型態陣列Edge,Edge 陣列內含有三個代表 ...
#37. C/C++實戰013:BOOL和bool的區別及MSB6006報錯 - 每日頭條
什麼是boolbool是C++定義的標準數據類型:布爾類型,bool定義只有一個字節,可以用C++定義的標準關鍵字true和false來表示,即返回值為。
#38. 資料型別與運算
C語言 裡並沒有boolean資料型態(只有true和false兩種值),條件是否成立完全是看運算式的結果, ... 像java語言就提供了boolean資料型態,且邏輯運算和數值運算不能混用, ...
#39. C++中bool的回傳值只有0或1嘛 - 有解無憂
C++ 中bool的回傳值只有0或1嘛. ... 為什么在判斷兩者相等時的bool回傳值是2?bool值什么時候不是0或1?在全域函式中沒有錯誤的 可是在成員函式卻無法 ...
#40. C語言如何才能使用bool類型 - 碼上快樂
解決辦法:加上頭文件include lt stdbool.h gt ,就可以直接使用類型bool true false nbsp.
#41. C语言的布尔类型- pharen - 博客园
_Bool 依然仍是整数类型,但与一般整型不同的是,_Bool变量只能赋值为0或1,非0的值都会被存储为1。 C99还提供了一个头文件<stdbool.h> 定义了bool代表_ ...
#42. 在C語言中如何使用bool型別
在C語言中如何使用bool型別,1樓寫在楓葉上的故事布林型bool 變數的值只有真true 和假false 。 布林型變數可用於邏輯表示式,也就是或與非.
#43. 为什么c语言没有布尔类型? - 知乎
我记得有一个bool.h,不过你完全可以自己宏定义的.
#44. Lecture 3
:a=10; b=4; c=false; d=true; e=true;f=false;g=true;h=false;. 範例(3-2.cpp) ... 布林運算子/ Boolean Operator ... 在C/C++語言中,非0為真(true),0為偽(false).
#45. 資料型態
C 的基本資料型態主要區分為整數(Integer)、浮點數(Float)、字 ... C 語言一開始並沒有布林值型態,而是將零值或NULL 視為不成立,其他值都是成立,C99 有 bool ...
#46. C 的bool型用法 - 嘟油儂
C 的bool型用法,1樓匿名使用者布林變數用起bai來相當簡單!du因為值只能zhi 有2種true falseture為真,false為假宣告dao.
#47. 變數型態與變數宣告| C++與演算法
char, 字元(半形字), Character, 'a' 、 'R' 、 '1' 、 '@' 、 '*' ... string, 字串(文句), String, "Hello" 、 "^_^" 、 "Rock!" ... bool, 布林(是非), boolean ...
#48. c 語言bool C語言中定義bool型 - Dykpo
C語言 中定義bool型學前教育基礎教育高校與高等教育語言/ 資格考試行業資料法律建筑互聯網生活實用實用模板生活娛樂政務民生說明書百度文庫互聯網上傳資源上傳文檔加入 ...
#49. c語言如果要定義函式的返回型別為布林型別 - 迪克知識網
c語言 問題布林函式的問題,c語言如果要定義函式的返回型別為布林型別, ... c語言裡面是沒來有bool(布林)型別自的,c++裡面才有,這就是說,在c++ ...
#50. C语言中中bool类型报错解决 - 程序员宅基地
今天早上用C语言写断链表,定义了一个bool类型发现提示未定义标识符然后去度娘上查了一下发现C语言没有BOOL类型变量boolean类型是C++所独有的下面说说解决办法: 方法 ...
#51. boolean c - 軟體兄弟
boolean c,所謂的布林函數(Boolean function) 是指傳回真假值的函數(function) ,由於C 語言中運算式(expression) 結果為0 就表示假(false) ,非0 值就表示真(true) ...
#52. 第一章認識C語言
C++ 有bool 型態,C 則沒有; 布林(boolean)型態的值只有true 和false 兩種. bool status=true; // 宣告布林變數status,並設值為true. bool flag=false; // 宣告布林 ...
#53. C语言中bool的用法 - 百度知道
bool 在绝大多数编译器编译时都将其实现为1字节,即sizeof(bool)的值为1,加上其只有两个值的值域{true, false},是C语言中最小的数据类型了。
#54. 浅谈C语言中的布尔(bool)类型 - 博客
这是最常见的写法,能被任何C语言编译器认可。 今天我在一段程序里看见这么一行#include ,这个陌生的头文件还以std打头而且还和bool有关,引起了 ...
#55. C语言中有bool类型吗? - 相关文章 - 术之多
之前一直都没有注意到,最近在用C语言写DSP算法时,偶然间发现我函数中定义的bool类型的变量在VC6.0(我主要用它来检查一下语法错误)中编译居然报错了,说是bool类型没有 ...
#56. 【c語言gcc9.1.0環境下編譯報錯】error: 'true' undeclared (first ...
發現是demo裡使用到的 true 和 flase 編譯報錯了,原來gcc9.1.0下 bool關鍵字 還未支援。 深入分析後發現,原來C語言(C99之前)中沒有 bool關鍵字 。
#57. 布林(資料類型)
布林(英語:Boolean)是電腦科學中的邏輯資料型別,以發明布林代數的數學家喬治· ... C++程式語言在其標準化過程中引入了 bool 、 true 和 false 關鍵字,增加了原生 ...
#58. C++ bool 所占的記憶體空間與資料對齊(data alignment)
然而在實作上,由於不是所有的CPU 都能夠很有效率地處理單一bit 的運算,因此通常編譯器會用其他更有效率方式的處理。 C++ 語言標準並沒有硬性規定 bool ...
#59. C语言速成手册(二):布尔值、条件判断、循环 - Matrix67.com
C语言 的bool类型. C语言中没有布尔类型。任何一个整型的变量都可以充当布尔变量,用0表示False,其它数(默认为1)表示True。 观察下列代码片断。
#60. C語言的布林型別 - 程序員學院
但這種做法不直觀,而且沒有明確flag一定是布林值。所以我們又藉助c語言的巨集定義:. //巨集定義布林型別. #define bool int. #define true 1.
#61. C/C++數據類型bool - 人人焦點
int main() {bool flag = true; cout << flag << endl; // 1 flag = false; ... 一、布爾數據類型:在c語言裡面我們知道是沒有布爾數據類型的,而在C++中添加了布爾 ...
#62. C語言中有bool類型嗎? - 程式師世界
之前一直都沒有注意到,最近在用C語言寫DSP算法時,偶然間發現我函數中定義的bool類型的變量在VC6.0(我主要用它來檢查一下語法錯誤)中編譯居然報錯了, ...
#63. c語言中while的用法C語言中while的用法 - 多學網
c語言 中while的用法解析如下:. 一、1表示true,在bool型別取值false和true,0為false,非0為true(例如-1和2都是true)。程式中,這裡1就表示永真, ...
#64. 105 年公務人員普通考試試題 - 公職王
一、依據下方C 語言程式碼,請完成一布林(Bool)型態之函式Triangle(),並填寫呼叫此一函. 式之程式碼。此一函式參數包含整數型態陣列Edge,Edge 陣列內含有三個代表 ...
#65. Python 為什麼要在18 年前引入布林型別?且與C - IT人
這個bool 型別是int 型別的直接子型別(在C 中),並且在除了repr() ... 大多數評審人都認為Python 內的一致性要比跟其它語言的一致性更為重要。
#66. C語言的各類變數和零值的比較詳解 - IT145.com
在C語言中本來是不存在bool型別的,但在C99標準中加入了bool型別。 ... 在C++標準中,布林型別常數和整數、指標之間的轉換規則為:. false->0 true->1.
#67. [分享] Boolean in C/C++ - [email protected] - 痞客邦
Boolean 在一般程式語言中最主要的角色是作為『流程節制』的條件判定。 在C/C++ 裡面,if、for 和while 等流程節制都仰賴於前提的Boolean 運算成果翻譯 [在C89 裡面 ...
#68. What is the printf format specifier for bool? - Stack Overflow
This question isn't helpful to C programmers particularly because the C and C++ boolean systems are entirely different and the question is tagged C. That Google ...
#69. 第六型態 - 開卷
布林boolean. 在C語言中,我們可能會宣告一個 int 作為條件判斷的變數,但我們從上一節的表格中可以看到兩者佔用空間是有所差距, int 是4個bytes,而 bool 為1 ...
#70. C语言报错:unknown type name 'bool' - 简书
报错的意思:未知的类型名:'bool' 在C语言标准(C89)没有定义布尔类型,所以会报错。而C99提供了一个头文件定义了bool,true代表1,false代表0。
#71. 從C 到C++ - 朝陽科技大學
C++ 語言當中許多新的語法也可以用C 程式來模擬, 事實上早期的C++ 編譯器其實只 ... 因此將C 程式語言 先學好, 對於學C++ 語言將有莫大的幫助. ... 多用 bool 型別.
#72. c++ cin.get(ch)可設定給布林代數bool - minsin的部落格- 痞客邦
c++ cin.get(ch)可設定給布林代數bool. cin.get(ch)可設定給布林代數bool b=cin.get(ch),以檢測是否輸入成功?????,但不可設定給整數或字元變數, ...
#73. C++ boost::algorithm::any_of()用法及代碼示例- 純淨天空
它接受一個序列和一個謂詞,如果該謂詞對序列中的任何給定元素返回true,則返回true。 用法:. bool any_of ( InputIterator first, InputIterator last, Predicate p ) or
#74. 解決C的這種錯誤error: unknown type name 'bool' - 易春木
但是C語言內不是就有bool這種型別嗎,. 那為甚麼會出現這個錯誤呢?? 答: 有些版本的C 需要額外補上#include <stdbool.
#75. C bool type - 醉裡挑燈看Code
C 語言 從C99 開始,增加了bool 這個關鍵字。 嚴格來說是_Bool,bool 只是marco,其目的是為了與C++ 相容。 使用bool 時,需include <stdbool.h>。
#76. 布爾型變數bool - 華人百科
可能使用char類型表示一個布爾類型,也可能使用int類型表示一個布爾類型。很多函式館都定義了自己的布爾類型和相應的宏,枚舉,typedef。現在C99把C語言原生的布爾類型 ...
#77. 在C/C++ 中将int 转换为bool - IT工具网
我知道在C 和C++ 中,当将bool 转换为int 时, (int)true == 1 和 (int)false == 0 .我想知道反向转换... 在下面的代码中,在使用Visual Studio 2013 和Keil µVision 5 ...
#78. c語言中沒有string類型變數怎麼辦?沒有bool怎麼辦?__c語言
國慶閑來看C++,遇到C語言的一個問題,覺得很有趣。 "C語言中有string類型變數嗎?"這裡的string 有二義性。(1) 如果string 是普通詞彙,“C語言中有 ...
#79. C++中bool型的函式返回值為真應該怎麼寫 - WhatsUp
true 其實就是1. false 就是0. 所以你寫成return 1;. 或者return 0;. 就能達到你要的結果了.
#80. C 语言中不具有原生bool 类型 - 循迹研究室
有点标题党了,准确的说是C语言标准中并无bool这个关键字来表示布尔类型。在C++中我们通常使用bool变量存储逻辑值。但是,C语言中是没有bool类型的,C ...
#81. C 語言:typedef 的用法 - 傑克! 真是太神奇了!
bool flag1, flag2;. LIST_NODE node0, *free_list;. 第1行的 typedef 為 unsigned char ...
#82. c 未定義標識符bool C語言提示某個函數未定義求幫忙 - Ddmba
c 未定義標識符bool C語言提示某個函數未定義求幫忙_百度知道翻譯此網頁. t_70″ alt=” c 同c++代碼visual studio 2017編譯報錯. bool 未 聲明的 標識 ...
#83. C++ 從Zero 開始
首先,<< 是C++ 中的輸出指令,它負責把<< 右邊的運算式的結果輸出到<< 左邊的輸出 ... 從程式的輸出結果中我們可以看出,前兩次的bool (cin) 都得到了1,但是由於第二 ...
#84. C語言- 教育百科| 教育雲線上字典
C語言 ,是一種通用的、程序式的程式語言,廣泛用於系統與應用軟體的開發。 ... 增加了新關鍵字restrict, inline, _Complex, _Imaginary, _Bool.
#85. C++ Primitive Type 的標準定義小記 - OT Coding Note
為了寫出robust 、 less bugs 的程式碼,就要依照保證(C++ defined) 來 ... 在C 中,標準沒有定義keyword true 跟 false ,也沒有boolean type 的 ...
#86. c中非零值都表示真嗎,c中到底是1代表真0代表假 ... - 第一問答網
a=!0,在c++中,bool變數型別和int型別是互通的,int>0,bool為true,等於0時,為false。a=! 0,就是把為false的0,取反後變為true,賦值給a。
#87. 請問c語言中的"=="的返回值是什麼? - GetIt01
rt,在c語言中,對於表達式XX==XX的返回值,如果等號成立返回的「1」,是指true ... 不過在C23中改掉了。 true 變成了 ((_Bool)+1u) ,類型變成了 _Bool 而在預處理 ...
#88. 【程式學習】C語言裡面的資料型別_給CS50x_Week1的補充資料
在早期C語言設計時,並沒有這個資料型別,因此在使用上必須在標頭檔引入<stdbool.h>,才可以定義bool。 浮點數. 剛開始接觸程式設計的學生,一定會對於 ...
#89. [分享] Boolean in C/C++ @ blog :: 隨意窩Xuite日誌
比克爾語翻譯前面幾篇有提到bool 的問題翻譯今天忽然失眠,心血來潮,來分享一下bool ... 在C/C++ 裡面,if、for 和while 等流程節制都仰賴於前提的Boolean 運算後果。
#90. C语言中scanf - 对于c99的_Bool应该用什么格式?,C\C++交流 ...
C语言 的c99标准不是增加了_Bool么,那么在用scanf输入时应该用哪个格式符? 我试了,不是%d和%c c99应该引入了新的格式符吧(话说%d、%c这是叫格式符 ...
#91. redeclaration of C++ built-in type 'bool' 錯誤. - 开发者知识库
我在redhat linux 下安裝了gcc4.3.2 也生成了c++, gcc, cpp 等可執行文件但是用c++ test.cpp 編譯時卻發生了error: redeclaration.
#92. 【C++】的bool类型1_哔哩哔哩 - BiliBili
#93. 03-b03 布林值與比較運算子- 條件式選擇與程式碼排版| Coursera
本系列課程從零開始,教授一般認為最適合初學者的程式語言「Python」,目標是讓大家在完成本課程 ... 那麼bool 這個函數呢,就是會視情況它會回傳true 或是回傳false。
#94. C语言FIFO - 文章整合
fifo.c #include "fifo.h" #include <string.h> #include <stdio.h> fifo_t *fifo_creat(uint16_t num, uint16_t size, bool is_loop) { if((size > ...
#95. C++ Tutorial - W3Schools
C++ is a popular programming language. C++ is used to create computer programs. Start learning C++ now ». Examples in Each Chapter. Our "Try it Yourself" ...
#96. C++ Dersleri – 4 – Bool İfadesi - MuhammedMastar.com
Bu videoda C++'ta Bool ifadesini anlatıyorum.. ... C++ Dersleri – 4 – Bool İfadesi. Bu videoda C++'ta Bool ifadesini anlatıyorum.
#97. Language Guide (proto3) | Protocol Buffers | Google Developers
.proto Type, Notes, C++ Type, Java/Kotlin Type, Python Type ... set to the default value (for example whether a boolean was set to false ) or just not set ...
#98. Kiểu luận lý và cơ bản về Câu điều kiện If (Boolean and If ...
Trong C++, ngoài kiểu integer, floating point, character, thì vẫn còn một kiểu dữ liệu cực kỳ quan trọng. Bạn sẽ được học nó trong bài học hôm nay: Kiểu ...
boolc語言 在 [分享] Boolean in C/C++ - 看板C_and_CPP - 批踢踢實業坊 的推薦與評價
前面幾篇有提到 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,使得我們在程式碼中可以有條件的選擇是否用
這三個名稱。 也就是說,如果你不 #include <stdbool.h> 的話,bool 、 true 和
false 預設是未定義的。這樣可以避免跟原有程式碼撞名,或有必要時做一些處理。
此外,你可以發現,因為是使用 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,而得到更多的型別安全。
--
以上..
寫得很主觀, 細節沒仔細查證, 應該也有很多疏漏的.
歡迎與感謝大家的意見...
--
... <看更多>