2012-02-24 16 views
6

यहां टिप्पणियों में - https://stackoverflow.com/a/9393138/8047 - मुझे पता चला कि BOOL में int मान से अपना मान सेट करते समय कुछ अनपेक्षित व्यवहार किया गया है। अधिकतर, यदि मान 0x1000 पर सेट किया गया है तो इसे FALSE (आश्चर्यजनक रूप से) के रूप में मूल्यांकन किया जाता है।int मानों के प्रभाव "फिटिंग" नहीं - उद्देश्य-सी के लिए बूल या बूल?

NSLog(@"All zero? %d %d", (BOOL)0, (bool)0); 
NSLog(@"All one? %d %d %d", (BOOL)4095, (BOOL)4096, (BOOL)4097); // 4096=0x1000 or 8-bits 
NSLog(@"All one? %d %d %d", (bool)4095, (bool)4096, (bool)4097); 

Produces: 
All zero? 0 0 
All one? -1 0 1 
All one? 1 1 1 

मुझे लगता है कि यह अजीब है, लेकिन फिर, मैं बहुत वैसे भी BOOL को int से डाली नहीं है। हालांकि:

  1. क्या यह दर्शाता है कि bool को BOOL पर प्राथमिकता दी जानी चाहिए? क्यों या क्यों नहीं?
  2. यह ठीक

if (thatBool) {

        उपयोग करने के लिए या एक

if (thatBool ? YES : NO) {

    और क्यों पसंद करते हैं चाहिए?

नोट: यह इस प्रश्न का एक और विशिष्ट संस्करण है - Objective-C : BOOL vs bool - लेकिन मुझे लगता है कि यह इसमें जोड़ता है और डुप्लिकेट नहीं है।

उत्तर

3

मुझे लगता है कि (BOOL)40960 लिए मूल्यांकन किया जा रहा है, बस (BOOL)256 के रूप में एक साधारण अंकगणित अतिप्रवाह है, क्योंकि BOOL एक unsigned char है। और मुझे लगता है कि !! कास्टिंग चाल ("डबल निषेध") ठीक काम करता है:

NSLog(@"%i", (BOOL)256); // 0 
NSLog(@"%i", !!256); // 1 

इसका मतलब है कि मैं BOOL का उपयोग मानक कोको कोडिंग शैली रखने के लिए चाहते हैं और बस के लिए खतरनाक प्रकार डाले देखते हैं। thatBool ? YES : NO अभिव्यक्ति मेरी आंखों को दर्द देती है, आप ऐसा क्यों करना चाहेंगे? :)

+0

'!!' कास्टिंग चाल पर कोई लिंक? इन चीजों को खोजने के लिए थोड़ा मुश्किल है :) –

+0

यह एक साधारण [डबल अस्वीकृति] है (http://www.google.com/search?q=c+double+negation), जो खोजना आसान होना चाहिए। – zoul

+0

धन्यवाद @zoul, हाँ यह काफी आसान है। मुझे लगता है कि 'खतरनाक प्रकार के लिए देखना' सही है। –

2

1) bool सी ++ प्रकार है, BOOL उद्देश्य-सी है। int से कास्टिंग BOOL को ठीक से काम नहीं करता है क्योंकि YES सिर्फ (BOOL)1 = (signed char)1 (= 0x001) है और वह उदाहरण के लिए, (signed char)4 (= 0x100) के बराबर नहीं है।

2) दोनों काम करेंगे, दूसरा प्रोग्रामिंग में थोड़ा अनुभव रखने वाले किसी के लिए अपठनीय हो सकता है। मैं बराबर संकेतों के आकस्मिक चूक को रोकने के लिए बाईं ओर निरंतर के साथ अच्छी पुरानी सी-स्टाइल सुरक्षित हालत जांच पसंद करता हूं।

if (YES == isEnabled) { 

} 
+2

बस यह जोड़कर "अगर (वहबूल?हां: नहीं) {"बेकार है, अगर एक (अगर धारणा!) के अंदर सिर्फ एक ही बात है, तो यह वही बात है। – fbernardo

+1

मुझे शैली में योड पसंद है, मैं हमेशा कल्पना करता हूं कि प्रोग्रामर वास्तव में इस तरह की बात करता है और यह सिर्फ उल्लसित है :) – JustSid

+0

और यह बहुत व्यावहारिक है, वास्तव में :- डी – Alexander

0

किसी इंट का उपयोग करते समय, आप यह सुनिश्चित करके स्पष्ट हो सकते हैं कि int किसी विशेष मान के बराबर है या नहीं।

BOOL yesNo = ((int)4096 > 0); 
BOOL enableButton = (someInt >= 16); 

दूसरे शब्दों में, सीधे BOOL को int पास न करें; इसे एक सच्चे/झूठे बयान में बदल दें।