慎用BOOL!

今天學習到了Mattt Thompson的文章BOOL / bool / Boolean / NSCFBoolean,才發現自己自己之前用的多糊涂,以前一直覺得bool和BOOL感覺沒啥差別,都是判斷真值,要么是0要么是1,然而,真相并不是這樣...
按照matte的實例,我測試了一組:

static BOOL different (int a, int b) {
    return (a - b);
}

- (void)viewDidLoad
 {
    [super viewDidLoad];
    BOOL test=different(3, 7);
    NSLog(@"test:%d",test);
} 

然而輸出的結果竟然是-4!!!說好的0和1呢???
按照mattt所說的是因為BOOL在實際中被typedef為signed char

從算數運算中提取真值并不是一個好主意,它可能符合語法(畢竟,BOOL是一個signed char,因此它可以被視為數字),但是它在語意上完全說不通。所以,取而代之的方法是,使用==輸出的結果,或者將數值通過!(或者!!)轉換成布爾值。

然后百度得到的關于bool和BOOL的資料是這樣說的

說明:objective-c 中的BOOL 實際上是一種對帶符號的字符類型(signed char)的類型定義(typedef),它使用8位的存儲空間。通過#define指令把YES定義為1,NO定義為0。
注意:objective-c 并不會將BOOL作為僅能保存YES或NO值的真正布爾類型來處理。編譯器仍將BOOL認作8位二進制數,YES 和 NO 值只是在習慣上的一種理解。
問題:如果不小心將一個大于1字節的整型值(比如short或int)賦給一個BOOL變量,那么只有低位字節會用作BOOL值。如果該低位字節剛好為0(比如8960,寫成十六進制為0x2300),BOOL值將會被認作是0,即NO值。而對于bool類型,只有true和false的區別,即0為false,非0為true。

具體區別為

1、類型不同
BOOL為int型; bool為布爾型
2、長度不同
bool只有一個字節 ;BOOL長度視實際環境來定,一般可認為是4個字節
3、取值不同
bool取值false和true,是0和1的區別 ;BOOL取值FALSE和TRUE,是0和非0的區別
BOOL是微軟定義的typedef int BOOL(在windef.h中),0為FALSE,1為TRUE。(-1和2既不是TRUE也不是FALSE)。
bool取值false和true,0為false,非0為true。(例如-1和2都是true)。

附表如下:

| Name | Typedef | Header | True Value | False Value |
|: --------: |:--------:|:--------:|:--------:|:--------:|
| BOOL | signed char | objc.h |YES|NO|
| bool | _Bool (int) | stdbool.h |true|false|
| Boolean | unsigned char | MacTypes.h |TRUE|FALSE|
| NSNumber | __NSCFBoolean | Foundation.h |@(YES)|@(NO)|
| CFBooleanRef | struct | CoreFoundation.h | kCFBooleanTrue | kCFBooleanFalse |

注意:進行條件判斷時候不要加==來判斷,很容易出錯

參考:BOOL / bool / Boolean / NSCFBoolean

--------續上----------
前面測試BOOL類型返回為-4的例子,自己測了是-4,但是朋友們測出來是1,剛開始一直沒弄明白為什么會這樣,一模一樣的代碼,結果卻不同,后來查了資料才知道

{8E2E4D14-D758-65E9-9CBC-11352D357059}.png

mac終端和手機終端對于bool的定義是不同的,可自行驗證,對于bool還有很多值得研究的,再有新內容繼續續上

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容