1.BOOL與bool的區(qū)別
- bool 是0和1 分別對(duì)應(yīng) -> false/true
- BOOL 是0和非0(-256~255除0外) 分別對(duì)應(yīng)->NO/YES
bool boolA = 1;
bool boolB = 0;
bool boolC = 256;
bool boolD = -1;
bool boolE = 13;
BOOL BOOLA = 1;
BOOL BOOLB = 0;
BOOL BOOLC = 256;
BOOL BOOLD = -1;
BOOL BOOLE = 13;
NSLog(@"boolA = %d",boolA);
NSLog(@"boolB = %d",boolB);
NSLog(@"boolC = %d",boolC);
NSLog(@"boolD = %d",boolD);
NSLog(@"boolE = %d",boolE);
NSLog(@"===========");
NSLog(@"BOOLA = %d",BOOLA);
NSLog(@"BOOLB = %d",BOOLB);
NSLog(@"BOOLC = %d",BOOLC);
NSLog(@"BOOLD = %d",BOOLD);
NSLog(@"BOOLE = %d",BOOLE);
結(jié)果輸出為:
boolA = 1 // true
boolB = 0 // false
boolC = 1 // true
boolD = 1 // true
boolE = 1 // true
===========
BOOLA = 1 // YES
BOOLB = 0 // NO
BOOLC = 0 // NO
BOOLD = -1 // YES
BOOLE = 13 // YES
由以上結(jié)果可看出:bool的結(jié)果只有兩個(gè):0和1。除了0是0阔籽,其他任意數(shù)字都是1,沒(méi)有大小限制。
BOOL的范圍為8位二進(jìn)制數(shù)字墓猎,如果超出了8位缸兔,就截取后8位鲸匿。當(dāng)8個(gè)位置上都為0時(shí),返回0剧辐,所以0會(huì)返回0,256會(huì)返回0邮府,但是257會(huì)返回1荧关,因?yàn)橹唤厝『?位。
2.使用事項(xiàng)
bool
Introduced to standard C in the C99 spec. (The C99 standard was published in 1999, but it took some years after that to become widespread in use.) Prior to that, "plain" C had no built-in Boolean type, so libraries that built on top of C often defined their own. (And often continued using their own types for source/binary compatibility even after they embraced C99 compilers.)
Use this if you're writing ISO C and aren't working in the context of higher level libraries with their own Boolean types.Boolean
Defined by Carbon (the early-OSX-days compatibility bridge from the even older Mac Toolbox), which you might still see in some projects (due to transitive#include
of headers that are really only around for compatibility with really old source code).
Don't use this.BOOL
Defined by ObjC because NeXTSTEP needed its own Boolean type back in 1988. (The oldestobjc.h
I can find on my office bookshelf dates to 1992 and includes a definition ofBOOL
.)
ObjCBOOL
has often been defined astypedef signed char
, meaning that it can hold more values than justYES
(1) andNO
(0). That can be a problem if you aren't careful. (Why even do that? Because if a type is one bit wide, it's hard to pack into well-aligned memory for good performance.)
However, in iOS 64-bit (including tvOS) and watchOS, the compiler definesOBJC_BOOL_IS_BOOL
, which makes ObjCBOOL
just an alias for C99bool
. That means the language/compiler ensures that nonzero values are always stored as 1, so you don't have the issues that come fromtypedef signed char BOOL
. (Still gotta worry about them on macOS or 32-bit iOS, though.)TLDR
If you're working in ObjC with ObjC frameworks (like Cocoa, UIKit, etc), you should useBOOL
for consistency with the APIs you're interacting with. (Besides,YES
andNO
are much louder thantrue
andfalse
, and it's good to be emphatic when you're talking about absolute truth, right?)
DO NOT COMPARE TO YES
在條件判斷語(yǔ)句中褂傀,不要直接使用x == YES忍啤,或x != YES這種寫法
而要直接使用if (hasXXX) 或 if (isXXX) 這種寫法
還有就是避免將大于一個(gè)字節(jié)(8位二進(jìn)制)的值賦值給BOOL類型的變量,如
BOOL a = 256
參考:
BOOL’s sharp corners
[Objc 中 “== YES” 的愚蠢行為有多可怕]
(http://www.reibang.com/p/75b88d2a0380)
is-there-any-difference-between-bool-boolean-and-bool-in-objective-c
iOS中BOOL跟bool的區(qū)別