क्या YES / NO, TRUE / FALSE और सत्य / असत्य के बीच अंतर है?


154

सरल प्रश्न वास्तव में; क्या इन मूल्यों में अंतर है (और BOOL और बूल के बीच अंतर है)? एक सहकर्मी ने उल्लेख किया कि वे उद्देश्य-सी में विभिन्न चीजों का मूल्यांकन करते हैं, लेकिन जब मैंने उनकी संबंधित .h फ़ाइलों में टाइपडिफ़ को देखा, तो YES / TRUE / सत्य सभी को परिभाषित किया गया था 1और NO / FALSE / गलत सभी के रूप में परिभाषित किया गया था 0। क्या वास्तव में कोई अंतर है?


5
व्यावहारिक दृष्टिकोण से कोई अंतर नहीं है। आप शायद अंतर दिखाने के लिए कई तरह के टोटके कर सकते हैं, लेकिन आप आम तौर पर "अपरिभाषित व्यवहार" क्षेत्र में भटक रहे होंगे।
गरम लक्स

जवाबों:


84

कोई व्यावहारिक अंतर नहीं है बशर्ते आप BOOLचरों के रूप में चर का उपयोग करें । C, बूलियन अभिव्यक्तियों को इस आधार पर संसाधित करता है कि वे 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!

दूसरे शब्दों में, निर्माण का उपयोग करें जैसा कि उनका इरादा है और उपयोग किए जाने वाले दस्तावेज हैं और आप सी में चोट लगने की दुनिया से खुद को अलग कर लेंगे।


100

मेरा मानना है कि वहाँ है के बीच एक अंतर 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 यस नहीं है!

ज्यादातर लोगों के लिए यह एक अनावश्यक चिंता है, लेकिन अगर आप वास्तव में एक बूलियन चाहते हैं तो इसका उपयोग करना बेहतर है bool। मुझे जोड़ना चाहिए: iOS एसडीके आम तौर BOOLपर अपनी इंटरफ़ेस परिभाषाओं पर उपयोग करता है , इसलिए यह एक तर्क है कि इसके साथ रहना चाहिए BOOL


5
लेकिन ध्यान दें कि कोई था मूल सी कार्यान्वयन bool, और इसलिए यह परंपरा एक का उपयोग करने के किया गया है intया charएक बूलियन के रूप में, कभी कभी एक #define अंतर छिपाने के लिए और कभी कभी नहीं करने के लिए के साथ। वास्तव में, मुझे यकीन है कि अगर यहां तक कि मौजूदा मानकों की आवश्यकता नहीं कर रहा हूँ boolएक तरह से रोकता है की जांच है कि यह आंतरिक संरचना है में लागू करने की।
हॉट लक्स

1
हालांकि, पहला printfझूठ कहता है। का मान bनहीं है YES, यह "शून्य नहीं" है, जो कि स्थिति परीक्षण है। तो आपके पास होना चाहिए printf("b is not zero"), जो जरूरी नहीं है कि जैसा है YES। इस मामले में, bदोनों "शून्य नहीं" और "हां नहीं" है।
लॉरेंस Dol

धन्यवाद लॉरेंस, मैंने उन लाइनों के साथ एक अपडेट किया है।
दान जे

वास्तव में, मुझे Xcode 8.2 में दूसरा आउटपुट नहीं मिला। मैं कहाँ असफल हो गया?
इगोर किसिलुक

1
@HotLicks 0 और शून्य और गलत और सच्चे नहीं के बीच कोई अंतर नहीं है। जब तक मूल्य एक तार्किक बूलियन होने का इरादा है, तब तक द्विआधारी संगतता को बनाए रखने के लिए हमेशा यह इंटरफ़ेस होगा। समस्या तब शुरू होती है जब आप गैर-बूलियन का उपयोग करते हैं जो बूलियन की तरह लगते हैं, उदाहरण के लिए c मानक पुस्तकालय अनुप्रयोग प्रविष्टि फ़ंक्शन, सफलता पर मुख्य रिटर्न 0, कई इस 0 को एक बूलियन के रूप में सोच रहे हैं, जब वास्तव में यह एक अनुप्रयोग परिभाषित गणना या परिभाषित है। मूल्य, जो कि अक्सर असामान्य समाप्ति पर कैलेरो नॉनजरो होने की उम्मीद करते हैं।
दिमित्री

52

मैंने इस पर एक संपूर्ण परीक्षण किया। मेरे परिणामों को अपने लिए बोलना चाहिए:

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

3
[[NSObject] आवंटन] init] TRUE या YES के बराबर नहीं है। इसलिए यदि ([NSObject] आवंटन] init] == ​​TRUE के साथ ऑब्जेक्ट आरंभीकरण के लिए परीक्षण विफल हो जाएगा। जब भी कोई गैर शून्य मान करेगा, तो मैं एक विलक्षण "सत्य" मान को परिभाषित करने वाली भाषा के साथ सहज नहीं था।
DrFloyd5

3
@SamuelRenkert मैं एक ifया एक में एक गैर बूलियन मान लेने वाली भाषा के साथ सहज नहीं रहा while। जैसे ... while("guitar gently weeps")काम नहीं करना चाहिए ...
Supuhstar

@SamuelRenkert भी 2003 में पाए गए लिनक्स बैकडोर थे:if (user_id = ROOT_UID)
Supuhstar

14

आप इस प्रश्न का उत्तर पढ़ना चाह सकते हैं । संक्षेप में, ऑब्जेक्टिव-सी में (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

11

मुख्य (खतरनाक!) अंतर के बीच trueऔर YESJSON क्रमबद्धता में है।

उदाहरण के लिए, हमारे पास JSON- टाइप सर्वर अनुरोध है और json sence में सही / गलत भेजने की आवश्यकता है:

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

फिर हम इसे JSON स्ट्रिंग में भेजने से पहले कनवर्ट करते हैं

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

परिणाम है

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

एपीआई तर्क के कारण jsonString1त्रुटि हो सकती है।

इसलिए ऑब्जेक्टिव-सी में बूलियन से सावधान रहें।

सारांश में, केवल सटीक @YESऔर casted मूल्य के रूप में @((BOOL)expression)कर रहे हैं __NSCFBooleanके प्रकार और करने के लिए परिवर्तित trueJSON क्रमबद्धता के साथ। किसी भी अन्य भाव @(expression1 && expression2)( जैसे @(YES && YES)) भी __NSCFNumber (int)प्रकार के हैं और 1JSON में रूपांतरित हैं ।

PS आप बस स्ट्रिंग-वैल्यू बूलियन का उपयोग कर सकते हैं

@{@"bool" : @"true"}; // in JSON {"bool":true}

1

एक सूक्ष्म बग है जिसका किसी ने भी यहाँ उल्लेख नहीं किया है, मुझे लगता है कि मैं इसमें शामिल करूंगा ... किसी भी चीज़ से अधिक तार्किक त्रुटि:

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

इसलिए इस मुद्दे को यहाँ सिर्फ इतना है कि है (YES==1)और सी में तुलना एक बूलियन एक है, लेकिन एक मूल्य के आधार पर नहीं है।

क्योंकि YESसिर्फ एक #define(भाषा के लिए कुछ आंतरिक) के बजाय, इसका कुछ मूल्य होना चाहिए, और 1सबसे अधिक समझ में आता है।


यह अनिवार्य रूप से कम विस्तार के साथ 2 साल पहले से DanJ के रूप में एक ही जवाब है।
लॉरेंस Dol

@ लॉरेंसडोल मुझे पता नहीं है, यह उल्लेख करता है कि हां केवल # 1 होने के लिए निर्धारित है और भाषा के लिए आंतरिक नहीं है, जैसे कि यह उच्च स्तर की भाषा में हो सकता है ... किसी को संभवतः उस से मूल्य मिल सकता है ... लेकिन अच्छा ट्रोलिंग, हां के साथ।
ग्रैडी प्लेयर

0

मैं वे हाँ / नहीं अधिक आत्म व्याख्यात्मक कई मामलों में होना करने के लिए जोड़ने के बारे में सोचो। उदाहरण के लिए:

[button setHidden:YES];

से बेहतर लगता है

[button setHidden:TRUE];

2
मैं असहमत हूं; वे दोनों मेरे लिए, एक ही पढ़ें। हालांकि, एक यूआई में एक झूठ बोलने वाले व्यक्ति के लिए मुझे लगता है कि हां / नहीं अच्छा लग रहा है।
लॉरेंस डॉल

16
मैं भी असहमत हूं। यदि कुछ भी है, तो यह अलिखित मानकों से चिपक नहीं पाने के कारण खराब तरीके से पढ़ता है जो कि अन्य भाषाओं में वर्षों से उपयोग किए गए हैं। जब आप कई मानकों का पालन करने में विफल होते हैं तो IE इसका एक प्रमुख उदाहरण है।
FreeAsInBeer

1
2 अधूरे उत्तर के लिए आधा
डाउनवोट

-2

पहले आइए देखें कि क्या सच और गलत है और क्या पहली जगह में उन्हें अर्थ देता है।

हम एक संरचना का निर्माण कर सकते हैं जिसे लैम्ब्डा कैलकुलस में एक और b c कहा जाता है जैसे कि:

(\ifThenElse. <use if then else>)(\a. \b. \c. a b c)

जावास्क्रिप्ट में, यह इस तरह दिखता है:

(function(ifThenElse) {
    // use ifThenElse
})(function(a) {
    return function(b) {
        return function(c) {
            return a(b)(c);
        };
    };
});

ifThenElse के लिए उपयोगी होने के लिए, हमें एक फ़ंक्शन "सही" की आवश्यकता होती है, जो दाएं या बाएं का चयन करता है, और यह करता है कि अन्य विकल्प की अनदेखी करते हुए, या "झूठा" विकल्प को चुनने वाले फ़ंक्शन को "सही" नहीं लेता है।

हम इन कार्यों को इस प्रकार परिभाषित कर सकते हैं:

(\true. <use true>)(\a. \b. a) and (\false. <use false>)(\a. \b. b)

जावास्क्रिप्ट में यह इस तरह दिखता है:

(function(True) {
    // use True
})(function(a) {
     return function(b) {
         return a;
     }
});

(function(False) {
    // use True
})(function(a) {
     return function(b) {
         return b;
     }
});

अब हम निम्नलिखित कर सकते हैं

(\true. \false. \ifThenElse. \doThis. \doThat. ifThenElse true doThis doThat)
(\a. \b. a)(\a. \b. b)(\a. \b. \c. a b c)(\a. ())(\a. ())

doThis और doThat के साथ (\ a) (a) होने के कारण lambda पथरी मुद्रण / गणित / स्ट्रिंग्स जैसी किसी भी सेवा की पेशकश नहीं करती है, हम कर सकते हैं कुछ भी नहीं कर रहे हैं और कहते हैं कि हमने इसे किया (और बाद में इसे सेवाओं के लिए बदलकर धोखा दिया। हमारी प्रणाली जो हम चाहते हैं दुष्प्रभाव प्रदान करती है)

तो चलिए इसे देखते हैं।

(function(True) {
    return (function(False) {
        return (function(ifThenElse) {
            return (function(doThis) {
                return (function(doThat) {
                    return ifThenElse(True)(doThis)(doThat);
                });
            });
        });
    })
})(function(a) {
     return function(b) {
         return a;
     }
})(function(a) {
     return function(b) {
         return b;
     }
})(function(a) {
    return function(b) {
        return function(c) {
            return a(b)(c);
        };
    };
})(function(a) { console.log("you chose LEFT!"); })
(function(a) {console.log("you chose RIGHT");})();

यह एक गहरा वातावरण है जिसे सरल बनाया जा सकता है यदि हमें कई कार्यों में विभाजित करने के लिए सरणियों / मानचित्रों / तर्कों / या एक से अधिक विवरणों का उपयोग करने की अनुमति दी गई है, लेकिन मैं रखना चाहता हूं कि मैं उतना ही शुद्ध हूं जितना कि एक तर्क के कार्यों के लिए खुद को सीमित कर सकता हूं केवल।

ध्यान दें कि नाम / True / False का कोई निहित महत्व नहीं है, हम आसानी से उन्हें हां / ना, बाएँ / दाएँ, दाएँ / बाएँ, शून्य / एक, सेब / नारंगी का नाम दे सकते हैं। इसमें इस बात का महत्व है कि जो भी चुनाव किया जाता है, वह केवल उस तरह के चयनकर्ता के कारण होता है जिसे उसने बनाया है। इसलिए यदि "LEFT" छपा है, तो हम जानते हैं कि चयनकर्ता केवल सच हो सकता है, और इस ज्ञान के आधार पर हम अपने आगे के निर्णयों का मार्गदर्शन कर सकते हैं।

इसलिए संक्षेप में

function ChooseRight(left) {
    return function _ChooseRight_inner(right) {
        return right;
    }
}
function ChooseLeft(left) {
    return function _ChooseLeft_inner(right) {
        return left;
    }
}

var env = {
    '0': ChooseLeft,
    '1': ChooseRight,
    'false': ChooseRight,
    'true': ChooseLeft,
    'no': ChooseRight
    'yes': ChooseLeft,
    'snd': ChooseRight,
    'fst': ChooseLeft
};
var _0 = env['0'];
var _1 = env['1'];
var _true = env['true'];
var _false = env['false'];
var yes = env['yes'];
var no = env['no'];

// encodes church zero or one to boolean
function lambda_encodeBoolean(self) {
    return self(false)(true);
}
// decodes a Boolean to church zero or one
function lambda_decodeBoolean(self) {
    console.log(self, self ? env['true'] : env['false']);
    return self ? env['true'] : env['false'];
}

lambda_decodeBoolean('one' === 'two')(function() {
    console.log('one is two');
})(function() {
    console.log('one is not two');
})();

lambda_decodeBoolean('one' === 'one')(function() {
    console.log('one is one');
})(function() {
    console.log('one is not one');
})();

-7

नहीं, YES / NO TRUE / FALSE (1/0) को संदर्भित करने का एक अलग तरीका है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.