2012-06-21 14 views
9

मैं उद्देश्य-सी में 2 बूल मानों की तुलना करना चाहता हूं।उद्देश्य-सी में, 2 बूल मानों की तुलना करने के लिए सुरक्षित और अच्छा तरीका?

मुझे पता चला कि निम्नलिखित कोड के (3) - (6) काम करता है।
(1) - (2) काम नहीं करता है क्योंकि बूल सिर्फ signed char है।

(3) काम करता है और बहुत पठनीय है लेकिन मुझे लगता है कि bool उद्देश्य-सी नहीं है।
उद्देश्य-सी कोड में bool का उपयोग करना अच्छा है?

उद्देश्य-सी में 2 बूल मूल्यों की तुलना करने का सुरक्षित और अच्छा तरीका कौन सा है?
तुलना करने के लिए अन्य बेहतर तरीके हैं?

BOOL b = YES; 
BOOL c = 2; 

NSLog(@"(1) %d", b == c); // not work 
NSLog(@"(2) %d", (BOOL)b == (BOOL)c); // not work 
NSLog(@"(3) %d", (bool)b == (bool)c); 
NSLog(@"(4) %d", !b == !c); 
NSLog(@"(5) %d", !!b == !!c); 
NSLog(@"(6) %d", (b != 0) == (c != 0)); 

परिणाम:

(1) 0 
(2) 0 
(3) 1 
(4) 1 
(5) 1 
(6) 1 
+7

'2' एक वैध' BOOL' मूल्य है नहीं; केवल 'हां' और 'नहीं' हैं। आप क्या कर रहे हैं अमान्य है। – trojanfoe

+0

चौथी विधि मेरे लिए अच्छी लगती है। यह छोटा है, और यह सुरक्षित रूप से मूल्य को 0 या 1. – nhahtdh

+1

@trojanfoe में परिवर्तित करता है: बात यह है कि, ओबज-सी खुशी से बूल की संख्या असाइनमेंट स्वीकार कर लेगा, और आप इसके साथ थोड़ा सा ऑपरेशन भी कर सकते हैं। – nhahtdh

उत्तर

5

उद्देश्य-सी में bool का उपयोग करने के लिए यह पूरी तरह से मान्य है क्योंकि यह C99 मानक (§7.16) का हिस्सा है। मेरी राय में यह बूलियन प्रकारों की सुरक्षित तुलना को संभालने का सबसे अच्छा तरीका भी है।

हर जगह bool का उपयोग न करने का एकमात्र कारण यह है कि BOOL उद्देश्य-सी और ढांचे में सर्वव्यापी है।

+0

मैं हर जगह 'बूल' का उपयोग करता हूं, सिवाय इसके कि कोको एपीआई 'बूल' कहलाता है। एक से दूसरे में एक सुरक्षित रूपांतरण होगा (फू बूल है और बार बूल है): 'foo = bar? सत्य: झूठा; 'या' बार = foo? हां: नहीं; ' – JeremyP

+0

धन्यवाद। मैंने सोचा कि बूल सी ++ था। @ जेरेमीपी, क्यों 'foo = bar; '' bar = foo;' सुरक्षित नहीं हैं? –

+0

'सत्य' या 'झूठी' को 'BOOL' को असाइन करना मान्य और सुरक्षित दोनों है। मानक कहता है कि वे पूर्णांक स्थिरांक '0' या' 1' (§7.16 में भी) में विस्तार करते हैं। –

1

=, एक वैध BOOL करने के लिए अपने नंबर कन्वर्ट द्वारा "2"

अपने संदर्भ में

, 2 है जवाब देने के क्या मतलब है तुम्हारा द्वारा हाँ

Int number = 2; 
BOOL c = (number == 2); //2 is YES 

है> 0 = हाँ

Int number = 2; 
BOOL c = (number > 0); //2 is YES 

यह क्या सही है और क्या आपके आवेदन

+1

धन्यवाद। मैं हमेशा वैध बूल में कनवर्ट करने का प्रयास करता हूं जब मुझे पता चला कि 256 के गुणक पूरी तरह से 0 (NO) में परिवर्तित हो गए हैं। लेकिन यह संभव है कि एक विधि जिसने अन्य व्यक्ति ने 0/1 के अलावा BOOL मूल्य वापस किया है। और मैं वापस BOOL मान को वैध BOOL जैसे 'b = !! [obj methodWhchReturnsBOOL] में परिवर्तित नहीं करता;' तो, 'c = 2' हो सकता है। –

+0

यदि आप सही ढंग से BOOL का उपयोग कर रहे हैं तो इस प्रकार का रूपांतरण आवश्यक नहीं है। अगर आपको इसके बारे में सोचना है, तो आप कुछ मौलिक रूप से गलत कर रहे हैं। अभिव्यक्ति (बी एंड सी सी) यस वापस आ जाएगी, भले ही सी 2 और बी 1 है। इस प्रकार के अभिव्यक्तियों पर आपके सभी कोड को आधार बनाना संभव है, और यह बूलियन बीजगणित में सही तरीका है। (यही कारण है कि इसे बुल/बूल/बूलियन कहा जाता है) संदर्भों के लिए मेरा उत्तर देखें। –

1

में गलत है पर मर्दाना निर्भर करता है objc.h से:

typedef signed char  BOOL; 
.... 

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

जाहिर है, BOOL signed char है, इसलिए यह सच है कि आप वेरिएबल को नंबर प्रदान कर सकते हैं BOOL प्रकार, की जो इच्छा गंदगी तुलना (के बाद से तुलना पूर्णांक तुलना है)।

मुझे लगता है कि निषेध का उपयोग कर 0 या 1 के लिए मनमाने ढंग से अभिन्न मूल्य कन्वर्ट करने के लिए अपने (4) विधि एक अच्छा लघु तरीका सुरक्षित रूप से 2 BOOL के तार्किक मान तुलना करने के लिए है।

4

अन्य उत्तरों के अलावा, मैं यह ध्यान रखना चाहूंगा कि समानता के लिए बूल की तुलना एक बहुत आम ऑपरेशन नहीं है। BOOL एक प्रकार नहीं है, यह सिर्फ एक मैक्रो है जो इस तथ्य को छुपाता है कि बुलियन केवल पूर्णांक हैं।

ई: हर बूलियन आपरेशन के लिए, आप बल्कि प्रोग्रामिंग संरचनाओं और ऑपरेटरों कि सही ढंग से बूलियन्स के रूप में पूर्णांक संभाल कर सकते हैं का उपयोग करना चाहिए।छ: if (condition1 == NO) {} होना चाहिए if (!condition1) {}

if (condition1 == condition2) {}
हो सकता है
if ((condition1 && condition2) || (!condition1 && !condition2)) {}
या बेहतर
BOOL newCondition = (condition1 && condition2) || (!condition1 && !condition2); if (newCondition) {}

सबसे छोटा रास्ता एक शर्त लिखने के लिए सबसे अच्छा तरीका होने की जरूरत नहीं है।

+2

मुझे नहीं लगता कि बूलियन मानों की तुलना शायद ही कभी होती है। एक आम मामला एक शूलकट प्रारंभिक वापसी के साथ एक बूल संपत्ति के लिए एक सेटटर है: - (शून्य) सेटएनिमेट: (बूल) एनिमेट {if (_animate == एनिमेट) वापसी; // अन्यथा जो कुछ भी सेट अप या एनीमेशन को फाड़ने के लिए करता है} –

+5

इसके अलावा, शुद्धता के लिए: 'BOOL' एक मैक्रो नहीं बल्कि एक टाइपिफ़ है। –

+0

'typedef' नोट के लिए धन्यवाद। _old value check_ वास्तव में कुछ खास है। आम तौर पर, आपको संपत्ति के प्रकार की परवाह नहीं है और आपको यह भी जानने की आवश्यकता नहीं है कि यह एक बूल है। – Sulthan

9

दो बूलियन मानों की तुलना करना एक एक्सओआर ऑपरेशन के साथ संभाला जाना चाहिए।

दो बूलियन्स सीधे तुलना करने के लिए कोशिश कर रहा है बूलियन बीजगणित के मूल सिद्धांतों का एक दुरुपयोग है: http://en.wikipedia.org/wiki/Boolean_algebra_(logic)

जब आप

BOOL a = (b == c); 

कर रहे हैं तो यह मान झूठी वापस आ सकते हैं, भले ही दोनों बी और सी सच हैं। हालांकि अभिव्यक्ति बी & & सी हमेशा वाईएस वापस कर देगी यदि दोनों बी और सी सच हैं, यानी 0 से अधिक, और अन्यथा नहीं।

इसके बजाय यह आप वास्तव में क्या करने के लिए कोशिश कर रहे हैं क्या है:

BOOL xor = b && !c || !b && c; 
BOOL equal = !xor; 

BOOL equal = !(b && !c || !b && c); 

या

BOOL equal = (b && c) || (!b && !c) 

आप समय बिताने के लिए सुनिश्चित करते हुए कि है, तो साथ बराबर अपने BOOL मान सामान्यीकृत होते हैं (यानी 1 या 0 पर सेट) तो आप कुछ गलत कर रहे हैं।

+0

धन्यवाद जेक देखें! मुझे लगता है कि आप और @ सुल्तान सही हैं। यह सुंदर है लेकिन यह मेरे लिए लंबा और कम पठनीय/लिखने योग्य है !! या (बूल)। सी में तार्किक xor ऑपरेटर क्यों नहीं है? –

+2

परिवर्तनीय नामों से पठनीयता में सुधार किया जा सकता है। यदि आप उदाहरण के लिए यह जांचना चाहते हैं कि कोई व्यक्ति भूख लगी है लेकिन थक गया है या थक गया है लेकिन भूख नहीं है, और आपके पास दो बूल हैं जिन्हें नाम दिया गया है, तो अभिव्यक्ति (भूखे और! थके हुए) || (भूखे और थके हुए) अभिव्यक्ति से अधिक समझ में आता है (भूखे! = थके हुए)। (भुखमरी कैसे थके हुए हो सकते हैं, और इसका क्या अर्थ होगा?) –

+1

ओपी के प्रश्न में चौथी अभिव्यक्ति वास्तव में समस्या को तेज़ और साफ करती है। यह संख्या 0 या 1 को सामान्यीकृत करेगा, फिर '==' XNOR (XOR नहीं) की तरह व्यवहार करेगा। अन्य अभिव्यक्तियां (3 और 5, 6) भी सही हैं। – nhahtdh

-1

यदि आप पूर्णांक 2 को एक प्रकार के BOOL के लिए आवंटित करते हैं, तो आपका कोड टूटा हुआ है। इसके बाद जो भी हो, वह वही है जो आप लायक हैं।

इसलिए, तुलना करने के लिए दो bools ए और बी केवल समझदार रास्ता

if (a == b) ... 
if (a != b) ... 
+0

मैं कहूंगा, एकमात्र समझदार तरीका 'if (a && b)' और 'if (! A && b)' होगा, क्योंकि यह ऑपरेटर मृत बूलियन ऑपरेशन में मर जाएंगे, जबकि '==' और '! = 'संख्यात्मक ऑपरेटरों हैं। – vikingosegundo