Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
385 views
in Technique[技术] by (71.8m points)

iphone - In Objective-c, safe and good way to compare 2 BOOL values?

I want to compare 2 BOOL values in objective-c.

I found out that (3)-(6) of the following code works.
(1)-(2) doesn't work because BOOL is just signed char.

(3) works and is very readable but I think bool isn't objective-c.
Using bool in objective-c code is good?

Which is the safe and good way to compare 2 BOOL values in objective-c?
Are there other better ways to compare?

BOOL b = YES;
BOOL c = 2;

NSLog(@"(1) %d", b == c); // not work
NSLog(@"(2) %d", (BOOL)b == (BOOL)c); // not work
NSLog(@"(3) %d", (bool)b == (bool)c);
NSLog(@"(4) %d", !b == !c);
NSLog(@"(5) %d", !!b == !!c);
NSLog(@"(6) %d", (b != 0) == (c != 0));

results:

(1) 0
(2) 0
(3) 1
(4) 1
(5) 1
(6) 1
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Comparing two boolean values should be handled with an XOR operation.

Trying to compare the two booleans directly is a misuse of the fundamentals of Boolean Algebra: http://en.wikipedia.org/wiki/Boolean_algebra_(logic)

When you are doing

BOOL a = (b == c);

then this value may return false even if both b and c are true. However the expression b && c will always return YES if both b and c are true, i.e. greater than 0, and NO otherwise.

Instead this is what you are actually trying to do:

BOOL xor = b && !c || !b && c;
BOOL equal = !xor;

equivalent with

BOOL equal = !(b && !c || !b && c);

or

BOOL equal = (b && c) || (!b && !c)

If you have to spend time making sure that your BOOL values are normalized (i.e. set to either 1 or 0) then your doing something wrong.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...