2009-03-05 82 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} 
相關問題