真的很简单的问题;这些值有没有区别(并且BOOL和bool之间有区别)?一位同事提到他们对Objective-C中的不同事物进行评估,但是当我在他们各自的.h文件中查看typedefs时,YES/TRUE/true都被定义为1
,而NO/FALSE/false都被定义为0
。有什么区别吗?objective-c中的YES/NO,TRUE/FALSE和true/false是否有区别?
回答
没有实际的区别提供您使用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.
我觉得他们补充YES/NO更在许多情况下不言自明。例如:
[button setHidden:YES];
听起来比
[button setHidden:TRUE];
我不同意;他们对我都是一样的。但是,在一个非专业人士的用户界面中,我认为是/否看起来更好。 – 2011-06-24 01:23:05
我不同意。如果有的话,由于不坚持多年来在其他语言中使用的不成文的标准,它读得很差。 IE是一个很好的例子,说明当你不遵守大量标准时会发生什么。 – FreeAsInBeer 2011-07-21 23:40:45
-1留下两个可能被列为一个的答案 – Supuhstar 2013-02-20 01:36:49
您可能需要阅读的答案,这样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
我相信有是bool
和BOOL
之间的差异,看看这个网页的的解释为什么:
http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
因为BOOL
是unsigned char
而非基本类型,BOOL
类型的变量能够包含比YES
和NO
其他值。
考虑以下代码:
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
的理由。
我对此做了详尽的测试。我的结果应该为自己说话:
//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
有没有人在这里提到一个微妙的错误,我想我会包括更多的逻辑的...错误比什么:
int i = 2;
if(i); //true
if(i==YES); // false
if((!!i)==YES); //true
所以这里的问题仅仅是(YES==1)
和C中的比较不是基于价值的布尔一个,但一个。
因为YES
只是一个#define
(而不是语言固有的东西),它必须是一些价值,而1
是最有意义的。
true
和YES
之间的主要(危险!)区别在于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}
- 1. DotNetNuke的“TrueFalse”配置文件属性标签
- 2. $ @和$ $是否有区别?
- 3. //和m //是否有区别?
- 4. Ruby中的“!=”和“!〜”是否有区别?
- 5. 在Perl中,/^/和/ ^/m是否有区别?
- 6. RSpec中'expect'和'should'是否有区别?
- 7. SqlConnection.CreateCommand和新的SqlCommand是否有区别?
- 8. 1.week和1.weeks是否有区别?
- 9. QString&和QString之间是否有区别?
- 10. .JPG和.jpg是否有区别?
- 11. ** copy **和** addAll **之间是否有区别?
- 12. $(e.currentTarget)和$(this)之间是否有区别?
- 13. UTF8Encoding.UTF8.GetBytes和Encoding.UTF8.GetBytes是否有区别?
- 14. `ListView.invalidateViews()`和'Adapter.notifyDataSetChanged()'之间是否有区别?
- 15. “margin:0 auto”是否有区别?和“margin:auto;”
- 16. CGImageGetWidth(workingImage.CGImage)和workingImage.size.width是否有区别?
- 17. `* x`和`x *`是否有区别?
- 18. TINYINT(1)和INT(1)是否有区别?
- 19. Interop.AZROLESLib和Microsoft.Interop.Security.AzRoles是否有区别?
- 20. Web API和MVC HttpConfiguration是否有区别?
- 21. DB_DOUBLE和dbDouble是否有区别?
- 22. if $ str =“”和if($ str)是否有区别?
- 23. '/'和''路线是否有区别?
- 24. Phongap config.xml和Cordova config.xml是否有区别?
- 25. WebRTC和Websockets。是否有区别
- 26. HttpContext.Current.Request和HttpContext.Request是否有区别?
- 27. MASM shellcode和NASM shellcode是否有区别
- 28. _function和function之间是否有区别?
- 29. variant()和variant之间是否有区别?
- 30. RenderPartial和RenderPage是否有区别?
从实际的角度来看,没有区别。你大概可以做各种各样的技巧来证明不同之处,但是你通常会陷入“未定义的行为”领域。 – 2012-01-21 19:03:42