2012-01-17 14 views
15

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

मान लीजिए:

bool var = !!true; 

यह चर के लिए आवंटित करेगा "सही"। बेकार लगता है, लेकिन मैं "जोर" का दृश्य स्टूडियो की परिभाषा देख रहा था, और यह है:

#define assert(_Expression) (void)((!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0)) 

ऐसा क्यों है "_Expression" नकारना है दो बार?

मुझे आश्चर्य है कि वे "!" को मजबूर करना चाहते हैं ऑपरेटर को बुलाया जाना चाहिए (मामले में यह अधिभारित है), लेकिन यह एक अच्छा कारण प्रतीत नहीं होता है।

+0

अच्छा सवाल, +1 – jlledom

+1

http://stackoverflow.com/questions/248693/double-negation-in-c-code – cnicutar

+0

http://stackoverflow.com/questions/1310344/why-use-when-converting -इंटर-टू-बूल – cnicutar

उत्तर

7

!! गारंटी देता है कि परिणाम एक 1 या 0 के रूप में खत्म हो जाएगा, बल्कि सिर्फ _Expression या 0. सी में के मूल्य से, यह कोई बात करने की संभावना नहीं है, लेकिन C++ मैं इस पर अभिव्यक्ति का परिणाम बदल जाता है लगता है एक bool प्रकार, जो कुछ मामलों में उपयोगी हो सकता है। यदि आपके पास कुछ एपीआई है जिसके लिए एक शाब्दिक 1 या 0 की आवश्यकता होती है, तो !! का उपयोग करके ऐसा करने का एक तरीका होगा।

1

इसका उपयोग यह सुनिश्चित करना है कि मान या तो 0 या 1 है। मुझे लगता है कि यह सी ++ के बूल प्रकार के साथ अनिवार्य है।

4

यह है कि आप एक पूर्णांक चर है कि या तो 1 या 0 है चाहते हो सकता है संभव है।

तो उदाहरण के लिए आप 5 पास नहीं कर सकते हैं, इसके बजाय डबल अस्वीकृति उस 5 को 1 में बदल देगी।

#ifndef TRUE 
#define TRUE    1 
#endif 

इसलिए, की तरह एक अभिव्यक्ति:

int x = 5; 
if (x == TRUE) 
{ 
    //.... 
} 

पारित नहीं होता है, जबकि

if (x) 
{ 
    //.... 
} 

होगा

इसके अलावा, TRUE कैसे परिभाषित किया गया है पर एक नजर है।

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