真的很簡單的問題;這些值有沒有區別(並且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