2009-03-05 116 views
135

真的很简单的问题;这些值有没有区别(并且BOOL和bool之间有区别)?一位同事提到他们对Objective-C中的不同事物进行评估,但是当我在他们各自的.h文件中查看typedefs时,YES/TRUE/true都被定义为1,而NO/FALSE/false都被定义为0。有什么区别吗?objective-c中的YES/NO,TRUE/FALSE和true/false是否有区别?

+4

从实际的角度来看,没有区别。你大概可以做各种各样的技巧来证明不同之处,但是你通常会陷入“未定义的行为”领域。 – 2012-01-21 19:03:42

回答

70

没有实际的区别提供您使用BOOL变量作为布尔值。 Ç处理基于它们是否评估为0或不是0。因此,布尔表达式:

if(someVar) { ... } 
if(!someVar) { ... } 

装置相同

if(someVar!=0) { ... } 
if(someVar==0) { ... } 

这就是为什么可以评估任何基本类型或表达式作为布尔测试(包括例如指针)。请注意,你应该做前者,而不是后者。

注意,有一个区别,如果您分配钝值,所谓的BOOL变量和测试特定的值,所以总是把它们作为布尔值,只有从他们的#define值赋给他们。

重要的是,千万不要使用字符比较来测试布尔值 - 它不仅是冒险的,因为someVar可以被赋予一个非零值,但是在我看来更重要的是,它不能正确表达意图:

if(someVar==YES) { ... } // don't do this! 
if(someVar==NO) { ... } // don't do this either! 

换句话说,使用结构因为它们的目的和记录使用,你会免受伤害的世界就饶了自己在C.

-7

否,YES/NO是一种不同的方式来指代TRUE/FALSE(1/0)

+3

-1因为不说明为什么 – Supuhstar 2013-02-20 01:36:13

+3

-1没有指定 – vilanovi 2014-05-19 10:35:57

1

我觉得他们补充YES/NO更在许多情况下不言自明。例如:

[button setHidden:YES]; 

听起来比

[button setHidden:TRUE]; 
+1

我不同意;他们对我都是一样的。但是,在一个非专业人士的用户界面中,我认为是/否看起来更好。 – 2011-06-24 01:23:05

+14

我不同意。如果有的话,由于不坚持多年来在其他语言中使用的不成文的标准,它读得很差。 IE是一个很好的例子,说明当你不遵守大量标准时会发生什么。 – FreeAsInBeer 2011-07-21 23:40:45

+5

-1留下两个可能被列为一个的答案 – Supuhstar 2013-02-20 01:36:49

13

您可能需要阅读的答案,这样question。综上所述,在Objective-C(从objc.h定义):

typedef signed char  BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used. 
#define OBJC_BOOL_DEFINED 


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

我相信有boolBOOL之间的差异,看看这个网页的的解释为什么:
http://iosdevelopertips.com/objective-c/of-bool-and-yes.html

因为BOOLunsigned char而非基本类型,BOOL类型的变量能够包含比YESNO其他值。

考虑以下代码:

BOOL b = 42; 

if (b) { 
    printf("b is not NO!\n"); 
} 

if (b != YES) { 
    printf("b is not YES!\n"); 
} 

输出是:

B不,不!
b不是!

对于大多数人来说这是一个不必要的问题,但如果你真的想要一个布尔值,最好使用bool。我应该补充一点:iOS SDK的接口定义通常使用BOOL,所以这是一个坚持BOOL的理由。

46

我对此做了详尽的测试。我的结果应该为自己说话:

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

输出是:

2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.072 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.073 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.073 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.074 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.074 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.075 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.075 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.076 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.077 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.077 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.078 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.078 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.079 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.079 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.080 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.080 BooleanTests[27433:a0f] 1 
2013-02-19 20:30:37.081 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.081 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.082 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.091 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.092 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.093 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.093 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.094 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.094 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.095 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.095 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.096 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.096 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.097 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.098 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.101 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0 
2013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0 
0

有没有人在这里提到一个微妙的错误,我想我会包括更多的逻辑的...错误比什么:

int i = 2; 
if(i);  //true 
if(i==YES); // false 
if((!!i)==YES); //true 

所以这里的问题仅仅是(YES==1)和C中的比较不是基于价值的布尔一个,但一个。

因为YES只是一个#define(而不是语言固有的东西),它必须是一些价值,而1是最有意义的。

4

trueYES之间的主要(危险!)区别在于JSON序列化。

例如,我们有JSON-类型的服务器请求,需要发送真/假以JSON SENCE:发送为

NSData *data = [NSJSONSerialization dataWithJSONObject:requestParams options:0 error:nil]; 
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

的前

NSDictionary *r1 = @{@"bool" : @(true)}; 
NSDictionary *r2 = @{@"bool" : @(YES)}; 
NSDictionary *r3 = @{@"bool" : @((BOOL)true)}; 

然后我们把它转换成JSON字符串结果为

jsonString1 // {"bool":1} 
jsonString2 // {"bool":true} 
jsonString3 // {"bool":true} 

由于API逻辑jsonString1可能会导致错误。

所以要注意Objective-C中的布尔值。

P.S.您可以使用

@{@"bool" : @"true"}; // {"bool":true} 
相关问题