9

我想比较 Objective-c 中的 2 个 BOOL 值。

我发现以下代码中的 (3)-(6) 有效。
(1)-(2) 不起作用,因为 BOOL 只是signed char.

(3) 有效且可读性强,但我认为bool不是objective-c。在objective-c代码中
使用好吗?bool

在objective-c中比较2个BOOL值的安全和好方法是什么?
还有其他更好的比较方法吗?

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));

结果:

(1) 0
(2) 0
(3) 1
(4) 1
(5) 1
(6) 1
4

6 回答 6

9

比较两个布尔值应该使用 XOR 操作来处理。

试图直接比较两个布尔值是对布尔代数基础的误用: http://en.wikipedia.org/wiki/Boolean_algebra_(logic)

当你在做

BOOL a = (b == c);

那么即使 b 和 c 都为真,该值也可能返回假。但是,如果 b 和 c 都为真,即大于 0,则表达式 b && c 将始终返回 YES,否则返回 NO。

相反,这是您实际尝试做的事情:

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

相当于

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

或者

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

如果您必须花时间确保您的 BOOL 值已标准化(即设置为 1 或 0),那么您做错了什么。

于 2012-06-21T10:05:30.997 回答
5

在 Objective-C 中使用它是完全有效的,bool因为它是 C99 标准(第 7.16 节)的一部分。在我看来,这也是处理布尔类型安全比较的最佳方式。

bool不到处使用的唯一原因是它BOOL在 Objective-C 和框架中无处不在。

于 2012-06-21T08:58:07.100 回答
4

除了其他答案之外,我想指出比较布尔值是否相等并不是一个非常常见的操作。BOOL不是一种类型,它只是一个宏,它隐藏了布尔值只是整数的事实。对于每个布尔运算,您应该使用可以正确处理整数作为布尔值的编程结构和运算符:

例如: if (condition1 == NO) {}应该是if (!condition1) {}

if (condition1 == condition2) {}
可以
if ((condition1 && condition2) || (!condition1 && !condition2)) {}
或更好
BOOL newCondition = (condition1 && condition2) || (!condition1 && !condition2); if (newCondition) {}

编写条件的最短方式不一定是最好的方式。

于 2012-06-21T09:37:09.527 回答
1

BOOL通过回答“2”是什么意思,将您的号码转换为有效号码

在您的上下文中,是 2 = YES

Int number = 2;
BOOL c = (number == 2); //2 is YES

是 > 0 = 是

Int number = 2;
BOOL c = (number > 0); //2 is YES

这很大程度上取决于您的应用程序中什么是 TRUE 什么是 False

于 2012-06-21T08:38:02.120 回答
1

来自objc.h

typedef signed char     BOOL; 
....

#define YES             (BOOL)1
#define NO              (BOOL)0

显然, BOOL 是signed char,所以确实可以将数字分配给BOOL类型的变量,这会弄乱比较(因为比较是整数比较)。

我认为您的 (4) 使用否定将任意整数值转换为 0 或 1 的方法是安全比较 2 BOOL 的逻辑值的好方法。

于 2012-06-21T08:42:22.067 回答
-1

如果您将整数 2 分配给 BOOL 类型的变量,您的代码将被破坏。在那之后,无论你得到什么,这都是你应得的。

因此,比较两个 BOOL a 和 b 的唯一合理方法是

if (a == b) ...
if (a != b) ...
于 2014-03-19T22:46:13.113 回答