2011-02-05 16 views
7

संभव डुप्लिकेट:
Double Negation in C++ code.मैक्रो परिभाषा में डबल नकारात्मक का उद्देश्य क्या है, जैसे (!! (expr))?

मैं एक कोड बेस पढ़ रहा हूँ, और कुछ इस तरह लगता है:

#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0)) 

मैं समझ नहीं क्यों (!! (expr)) का उपयोग एक (expr) के बजाय किया जाता है। वैसे भी, एक नकारात्मक नकारात्मक मतलब सकारात्मक है, है ना? क्या मैं कुछ भूल रहा हूँ?

+0

मैं यह भी पता नहीं लगा सकता कि इस कोड का उद्देश्य क्या है! ;) – BlackBear

+0

आर की तरह कहते हैं, यह पूरी तरह से बेकार है। – GManNickG

+0

इस मामले में यह अनावश्यक है क्योंकि आपने स्वयं सही ढंग से बताया है। शायद यह कुछ संकलक चेतावनी से बचने के लिए जोड़ा गया था। –

उत्तर

6

यह बूल को अभिव्यक्ति डालने का एक तरीका है। सी ++ में, ऑपरेटर! अधिभारित किया जा सकता है।

सी ++ एक ही तरीका है: C/C++ के लिए एक और तरीका है

static_cast<bool>(expr) 

[संपादित करें] सी ++ ऑपरेटर ओवरलोडिंग के बारे में अधिक सोच रही थी, यह समझ बनाने के ऑपरेटरों का उपयोग कर से बचने के लिए। Boost.Spirit और Boost.Lambda जैसे पुस्तकालयों का उपयोग अभिव्यक्ति टेम्पलेट्स और आलसी मूल्यांकन का उपयोग करें, ताकि (expr) || call() जैसे अभिव्यक्ति अपेक्षित व्यवहार न करें। कि मैक्रो का सबसे बुलेट प्रूफ संस्करण इस तरह दिखता है:

#define uassert(expr) if(expr) {} else { uasserted(...); } 

यहाँ, expr bool के केवल रूपांतरण किया जाता है। else शाखा को uassert(x) else something_else(); जैसे अभिव्यक्तियों से बचाने के लिए आवश्यक है।

+0

इस उत्तर को स्वीकार करें, क्योंकि @ मैक्सिम ने दोनों स्पष्टीकरण और आगे ज्ञान दिया है। – fzhang

+1

और अब 'uassert (expr) 'अब अभिव्यक्ति नहीं है; यह एक बयान है। यह बहुत सीमित है जहां आप इसका उपयोग कर सकते हैं।यदि आप 'बूल' पर डालना चाहते हैं, तो बस 'बूल' पर डालें। –

+0

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

1

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

+0

वैसे भी होगा। – GManNickG

+0

@GMan, आमतौर पर हाँ, लेकिन शायद नहीं। यह संभव है कि 'बूल' में कोई अंतर्निहित रूपांतरण न हो लेकिन एक अधिभारित अस्वीकृति है। –

+0

@ स्टेवेन: कोई भी जो इस तरह की कक्षा लिखता है वह मूर्ख है। क्षमा करें, मैं अपने प्रथाओं का आधार नहीं लगाता जो किसी को गूंगा संभवतः लिख सकता है। – GManNickG

1

यह एक मुहावरे कभी-कभी एक बूलियन प्रकार में परिवर्तित करने के लिए सी ++ में उपयोग किया जाता है।

0

उदाहरण में आपने हमें दिखाया, !! पूरी तरह से बेकार है। हालांकि, सामान्य रूप से इसे _Bool पर कास्टिंग करने के लिए लगभग पूर्व-सी 99 के बराबर उपयोग किया जाता है, यानी 0 रहता है 0 और 0 कोई अन्य मान बन जाता है।

+1

'!!' काफी बेकार नहीं है। '(expr) || उधार (...) 'सी ++ में अपेक्षित काम नहीं कर सकता है अगर' || 'एक अधिभारित ऑपरेटर है। यही कारण है कि (expr) स्पष्ट रूप से पहले बुलियन को डाला जाना चाहिए। –

+0

मुझे याद दिलाने के लिए धन्यवाद कि मैं ऑपरेटर ओवरलोडिंग के साथ भाषाओं से नफरत क्यों करता हूं (या कम से कम ऐसे लोग जहां ऑपरेटरों को अन्य ऑपरेटरों के संदर्भ में निश्चित परिभाषाएं होनी चाहिए)। –

+1

@ मैक्सिम: भयानक तर्क। ध्यान दें: '!!' सी ++ में अपेक्षित काम नहीं कर सकता है अगर '!' एक ओवरलोडेड ऑपरेटर है। आपका तर्क आत्म-पराजित है: हां, कोई ऑपरेटर के साथ मूर्ख हो सकता है, आप आसानी से अनदेखा नहीं कर सकते हैं कि वे आपकी स्थिति में भी ऐसा ही कर सकते हैं। यह किसी भी रूढ़िवादी कार्यक्रम के लिए बेकार है, जो अपरंपरागत बकवास लोगों को लिखने की परवाह करता है? * अच्छे * कोड से अपने अभ्यासों को आधार दें, ताकि आप * अच्छे * प्रोग्रामिंग प्रथाओं को समाप्त कर सकें। – GManNickG

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