2012-07-11 13 views
20

क्या ऐसी स्थिति डालने का कोई तरीका है जो केवल तभी सत्य हो जब दो घटक में से कोई एक सत्य वापस आ जाए?एक्सओआर उद्देश्य-सी

BOOL var1 
BOOL var2 

कुछ से कम if((var1 && !var2) || (!var1 && var2))

धन्यवाद

+7

आप इस करता है, तो (var1^var2) का उपयोग कर सकते – Siddiqui

उत्तर

54

के रूप में ऑब्जेक्टिव-सी सी के एक सुपरसेट है, तो आप बस सी, जो ^ है से XOR ऑपरेटर का उपयोग करें।

+18

बिटवाइज़ XOR है यही कारण है कि, यदि आप एक तार्किक XOR चाहते हैं, बस का उपयोग '! ='। –

+2

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

+1

@DrewMcCormack, आप दो विस्मयादिबोधक चिह्नों का उपयोग करके किसी भी प्रकार को वास्तविक 'BOOL' में परिवर्तित कर सकते हैं। '!! var1! = !! var2' – DanSkeel

42

XOR

if(!!var1 != !!var2) 
{ 
    NSLog(@"XOR condition"); 
} 

विस्मयादिबोधक चिह्न BOOL (वास्तविक रूपांतरण, कास्टिंग नहीं)
को वार्स परिवर्तित तो यह समाधान काम करता है भले ही आपके चर BOOL नहीं हैं।

!!(0|nil) ≡ 0 
!!(any other number|object) ≡ 1 

इस मामलों में उपयोगी होता है जब आप यह सुनिश्चित करें कि वार्स का केवल एक ही nonnil है होना चाहता हूँ।

#define XOR != 

:

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

लघु, सुरुचिपूर्ण, आसान और सरल – meronix

+0

डिफ़ॉल्ट रूप से BOOL चर नहीं है। इस स्थिति में, मुझे लगता है कि यह असफल है। इसे जांचें –

+0

मुझे यह एक बीटीडब्ल्यू पसंद है लेकिन गाजर उत्तर –

0

कोशिश (int)var1^(int)var2 हाँ और नहीं वास्तव में निम्नलिखित के रूप में परिभाषित कर रहे हैं और फिर आप बस लिखें:

if (var1 XOR var2) { 

    ... 
} 

सच्चाई तालिका उत्पादन:
[टी XOR टी => एफ, टी! = टी => एफ],
[टी एक्सओआर एफ => टी; टी! = एफ => टी],
[एफ एक्सओआर टी => टी; एफ! = टी => टी] और
[एफ एक्सओआर एफ => एफ; एफ! = एफ => एफ]

0
if ((!var1)==var2) 
{ 
     NSLog(@"Yes"); 
} 
3

आप कोड है कि Ishu ऐसा करने से पता चलता है के लिए और अधिक स्पष्टता जोड़ सकते हैं:

+0

यह xor –

+0

@AlbertRenshaw हां नहीं है, क्योंकि यह एक ही सत्य तालिका में परिणाम देता है: [टी एक्सओआर टी => एफ; टी! = टी => एफ], [टी एक्सओआर एफ => टी; टी! = एफ => टी], [एफ एक्सओआर टी => टी; एफ! = टी => टी] और [एफ एक्सओआर एफ => एफ; एफ! = एफ => एफ]। –

+1

वाह आप सही हैं। मैं वास्तव में यह महसूस करने के लिए बहुत मूर्ख महसूस करता हूँ! मुझे पढ़ाने के लिए धन्यवाद –

2

एक मैक्रो एक विकल्प हो सकता है। यह वही व्यवहार रखेगा, लेकिन अब एक और अधिक पठनीय तरीके से।

#define XOR(x,y) (((x) && !(y)) || (!(x) && (y)))

if(XOR(var1, var2) { 

} 
संबंधित मुद्दे