Is there a difference between YES/NO,TRUE/FALSE and true/false in objective-c?
I believe there is a difference between bool
and BOOL
, check out this webpage for an explanation of why:
http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
Because BOOL
is an unsigned char
rather than a primitive type, variables of type BOOL
can contain values other than YES
and NO
.
Consider this code:
BOOL b = 42;if (b) { printf("b is not NO!\n");}if (b != YES) { printf("b is not YES!\n");}
The output is:
b is not NO!
b is not YES!
For most people this is an unnecessary concern, but if you really want a boolean it is better to use a bool
. I should add: the iOS SDK generally uses BOOL
on its interface definitions, so that is an argument to stick with BOOL
.
There is no practical difference provided you use BOOL
variables as booleans. C processes boolean expressions based on whether they evaluate to 0 or not 0. So:
if(someVar ) { ... }if(!someVar) { ... }
means the same as
if(someVar!=0) { ... }if(someVar==0) { ... }
which is why you can evaluate any primitive type or expression as a boolean test (including, e.g. pointers). Note that you should do the former, not the latter.
Note that there is a difference if you assign obtuse values to a so-called BOOL
variable and test for specific values, so always use them as booleans and only assign them from their #define
values.
Importantly, never test booleans using a character comparison -- it's not only risky because someVar
could be assigned a non-zero value which is not YES, but, in my opinion more importantly, it fails to express the intent correctly:
if(someVar==YES) { ... } // don't do this!if(someVar==NO ) { ... } // don't do this either!
In other words, use constructs as they are intended and documented to be used and you'll spare yourself from a world of hurt in C.
I did an exhaustive test on this. My results should speak for themselves:
//These will all print "1"NSLog(@"%d", true == true);NSLog(@"%d", TRUE == true);NSLog(@"%d", YES == true);NSLog(@"%d", true == TRUE);NSLog(@"%d", TRUE == TRUE);NSLog(@"%d", YES == TRUE);NSLog(@"%d", true == YES);NSLog(@"%d", TRUE == YES);NSLog(@"%d", YES == YES);NSLog(@"%d", false == false);NSLog(@"%d", FALSE == false);NSLog(@"%d", NO == false);NSLog(@"%d", false == FALSE);NSLog(@"%d", FALSE == FALSE);NSLog(@"%d", NO == FALSE);NSLog(@"%d", false == NO);NSLog(@"%d", FALSE == NO);NSLog(@"%d", NO == NO);//These will all print "0"NSLog(@"%d", false == true);NSLog(@"%d", FALSE == true);NSLog(@"%d", NO == true);NSLog(@"%d", false == TRUE);NSLog(@"%d", FALSE == TRUE);NSLog(@"%d", NO == TRUE);NSLog(@"%d", false == YES);NSLog(@"%d", FALSE == YES);NSLog(@"%d", NO == YES);NSLog(@"%d", true == false);NSLog(@"%d", TRUE == false);NSLog(@"%d", YES == false);NSLog(@"%d", true == FALSE);NSLog(@"%d", TRUE == FALSE);NSLog(@"%d", YES == FALSE);NSLog(@"%d", true == NO);NSLog(@"%d", TRUE == NO);NSLog(@"%d", YES == NO);
The output is:
2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 12013-02-19 20:30:37.061 BooleanTests[27433:a0f] 12013-02-19 20:30:37.072 BooleanTests[27433:a0f] 12013-02-19 20:30:37.073 BooleanTests[27433:a0f] 12013-02-19 20:30:37.073 BooleanTests[27433:a0f] 12013-02-19 20:30:37.074 BooleanTests[27433:a0f] 12013-02-19 20:30:37.074 BooleanTests[27433:a0f] 12013-02-19 20:30:37.075 BooleanTests[27433:a0f] 12013-02-19 20:30:37.075 BooleanTests[27433:a0f] 12013-02-19 20:30:37.076 BooleanTests[27433:a0f] 12013-02-19 20:30:37.077 BooleanTests[27433:a0f] 12013-02-19 20:30:37.077 BooleanTests[27433:a0f] 12013-02-19 20:30:37.078 BooleanTests[27433:a0f] 12013-02-19 20:30:37.078 BooleanTests[27433:a0f] 12013-02-19 20:30:37.079 BooleanTests[27433:a0f] 12013-02-19 20:30:37.079 BooleanTests[27433:a0f] 12013-02-19 20:30:37.080 BooleanTests[27433:a0f] 12013-02-19 20:30:37.080 BooleanTests[27433:a0f] 12013-02-19 20:30:37.081 BooleanTests[27433:a0f] 02013-02-19 20:30:37.081 BooleanTests[27433:a0f] 02013-02-19 20:30:37.082 BooleanTests[27433:a0f] 02013-02-19 20:30:37.091 BooleanTests[27433:a0f] 02013-02-19 20:30:37.092 BooleanTests[27433:a0f] 02013-02-19 20:30:37.093 BooleanTests[27433:a0f] 02013-02-19 20:30:37.093 BooleanTests[27433:a0f] 02013-02-19 20:30:37.094 BooleanTests[27433:a0f] 02013-02-19 20:30:37.094 BooleanTests[27433:a0f] 02013-02-19 20:30:37.095 BooleanTests[27433:a0f] 02013-02-19 20:30:37.095 BooleanTests[27433:a0f] 02013-02-19 20:30:37.096 BooleanTests[27433:a0f] 02013-02-19 20:30:37.096 BooleanTests[27433:a0f] 02013-02-19 20:30:37.097 BooleanTests[27433:a0f] 02013-02-19 20:30:37.098 BooleanTests[27433:a0f] 02013-02-19 20:30:37.101 BooleanTests[27433:a0f] 02013-02-19 20:30:37.102 BooleanTests[27433:a0f] 02013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0