2011-07-26 17 views
10

संभव डुप्लिकेट:
What is the difference between these (bCondition == NULL) and (NULL==bCondition)?C++ में NULL! = मान का अर्थ क्या है?

मैं सी ++ कोड का एक टुकड़ा के माध्यम से जा रहा था और

if (NULL != threadInfo) 
{ 
    ... 
    ... 
} 

मैं बस सोच रहा था की तरह एक कोड में आए क्या कोई अंतर नहीं है अभिव्यक्ति का उपयोग करने के बीच

if (threadInfo != NULL) 
{ 
    ... 
    ... 
} 

ऊपर क्या कहा जाता है। पहले पढ़ने के दौरान "अगर न्यूल थ्रेडइन्फो के बराबर नहीं है" पढ़ता है और दूसरा पढ़ता है "अगर थ्रेडइन्फो न्यूल के बराबर नहीं है"। मेरे लिए दूसरा एक और समझ में आता है।

+1

जब आपने यह कोशिश की, तो आपने क्या अंतर देखा? – marto

+4

आपको सी/सी ++ में 'if (Constant == variable) 'के बहुत सारे दिखाई देंगे क्योंकि यदि आप दूसरी बाएं हाथ छोड़ते हैं, तो आप एक स्थिर बाएं हाथ अभिव्यक्ति को असाइन करने का प्रयास करते हुए संकलित त्रुटि प्राप्त करेंगे। शायद कुछ समान है? – asawyer

+0

इससे कोई फर्क नहीं पड़ता है, यह सिर्फ एक समीकरण है, आपको चर और मूल्य के बजाय इसे केवल 2 मानों ('if (true == true)') के रूप में देखना चाहिए। – Sander

उत्तर

14

नहीं, इसमें कोई फर्क नहीं पड़ता। == के मामले में कुछ अंतर हो सकता है। बात यह है कि यदि आप गलती से के बजाय = लिखते हैं तो संकलक पहले मामले में एक त्रुटि देगा।

if (threadInfo = NULL) //always false. The compiler will give you a warning at best 

if (NULL = threadInfo) //Compiler error 

मैं व्यक्तिगत रूप से उस अभ्यास से नफरत करता हूं और सोचता हूं कि कोड लिखना बेहतर है जिसे सामान्य मानव भाषा में पढ़ा जा सकता है, योड भाषा नहीं।

+6

+1, निश्चित रूप से कम पठनीय, और पूरी तरह से कोई लाभ नहीं के लिए। यदि आप अक्सर इसके बारे में चेतावनी देने के लिए '==' के बजाय' = 'टाइप करते हैं और आपके पास चेतावनी देने के लिए * कुछ भी नहीं * है, तो आपको भी बड़ी समस्याएं हो सकती हैं। – rid

+1

चेतावनी बेकार है, क्योंकि टेम्पलेट कोड झूठी-सकारात्मक के टन उत्पन्न करता है। –

2

कोई फर्क नहीं पड़ता। NULL != ... लिखने का बिंदु यह है कि यदि आप इसके बजाय टाइपो बनाते हैं और NULL = ... लिखते हैं तो कोड संकलित नहीं होगा। यदि आपके पास ... = NULL था तो यह एक वैध असाइनमेंट हो सकता है और त्रुटि अनजान हो सकती है (लेकिन अधिकांश कंपाइलर्स इसका पता लगाते हैं और आपको चेतावनी देते हैं)। किसी ने एक बार insert a backdoor into the Linux kernel using this technique करने की कोशिश की।

यह भी ध्यान रखें कि अधिकतर लोग इस तरह कोड नहीं करते हैं।

0

आमतौर पर इसे एक सम्मेलन के रूप में उपयोग किया जाता है, और इसका कोई अलग अर्थ नहीं होता है।

क्योंकि असाइनमेंट lvals के लिए होता है, और NULL असाइन करने योग्य नहीं है, यह threadInfo == NULL या threadInfo != NULL बग का मतलब है जब यह डरावना threadInfo = NULL के खिलाफ सुरक्षा करता है।

और अधिक विस्तार के लिए, देखें this wikipedia article section on left-hand comparisons

2

कोई फर्क नहीं सिवाय इसके कि पहले विकल्प के रूप गलत टाइप नहीं किया जा सकता, नहीं है:

if (threadInfo = NULL) 
{ 
    ... 
    ... 
} 

और कुछ लोगों को इसकी जांच करने का संकलक स्विच का उपयोग करने के पता नहीं है यह (और कुछ कंपाइलर्स में नहीं है)।

4

तो threadInfo एक प्रकार है कि operator != ओवरराइड करता है की है, और उस वर्ग के मालिक एक सममित मुक्त समारोह है कि इस मामले में जहां दो तर्क लगा दिया जाता था संभालती प्रदान नहीं की है, एक अंतर हो सकता है (वहाँ भी एक की जरूरत हो सकती है उस प्रोग्रामर को आग लगाना)।

अन्यथा, यह स्वाद का विषय है। शायद इसे if(answer == 42) के बजाय if(42 == answer) लिखने वाले लोगों द्वारा पसंद किया जाएगा - यह आपको बराबर जांच के बजाय असाइनमेंट ऑपरेटर को गलत टाइप करने से बचाता है। लेकिन चूंकि आधुनिक कंपाइलर्स आपको चेतावनी देते हैं कि जब आप ऐसा करते हैं, तो यह बहस योग्य है कि यह दृष्टिकोण कुछ भी प्रदान करता है या नहीं।

+0

लेकिन अंतर यह है कि 'NULL! = ThreadInfo' संकलित नहीं होगा, क्योंकि int में ऑपरेटर नहीं है! = ThreadInfo प्रकार के लिए। मुझे नहीं लगता कि थ्रेडइन्फो एक पॉइंटर प्रकार है तो अंतर हो सकता है? –

+0

@ डगलस: एक फ्री-फ़ंक्शन 'ऑपरेटर हो सकता है! = (Int, threadInfo_TYPE)' उसी नामस्थान में 'threadInfo_TYPE' के रूप में परिभाषित किया गया है, जिस स्थिति में इसे कोएनिग लुकअप के कारण स्वचालित रूप से ध्यान में लाया जाएगा। – Jon

7

यह सुरक्षा के लिए है, तो आप गलती से

threadInfo == NULL 

के लिए के बजाय

threadInfo = NULL 

बारे में नहीं है! = वहाँ यह करने के लिए कोई जरूरत नहीं है, लेकिन यह लगातार है।

+5

मुड़ें। संकलक। चेतावनी। पर। : | – GManNickG

+1

मेरे पास मेरे कंपाइलर चेतावनियां हैं I हालांकि, मुझे ऐसा करने के बजाए कुछ करने के पीछे कारण पता है क्योंकि अन्य लोग इसे कर रहे हैं। मैंने अभी कारण बताया - जो वैध है - मैंने यह नहीं कहा कि आपको चेतावनी नहीं देनी चाहिए ... –

0

दोनों एक ही काम करते हैं।

if (value=NULL) // assignment instead of == operator 
{ 
} 
1

कोई अंतर नहीं है, यह तो Yoda सम्मेलन कोडिंग कहा जाता है: यह एक शैली परंपरा है कि के रूप में टाइपिंग गलतियों से बचने के लिए इस्तेमाल किया गया था।

if (NULL != threadInfo) 

ये तर्क के संदर्भ में सटीक समकक्ष हैं

if (threadInfo != NULL) 

के बराबर और

if (threadInfo) 
0

है।

दूसरा अधिक सहज है, जब कोई व्यक्ति को पहले से अधिक सुरक्षित माना जा सकता है क्योंकि यह (threadInfo = NULL) लिखने की अनुमति नहीं देता है, जिससे एक बग होता है।

0

नल स्मृति में एक संदर्भ है जिसमें कुछ भी नहीं है लेकिन इसका उपयोग करने के लिए कुछ भी पता नहीं है।

इसके द्वारा आप यह जांचने के लिए नल के पीछे तुलना कर सकते हैं कि किसी निश्चित वस्तु का मूल्य या कुछ भी नहीं है।

0

मुझे कोई फर्क नहीं पड़ता। हालांकि, NULL == someVar लिखने का अभ्यास आपको NULL = someVar लिखने से बचाएगा यदि आप दूसरे = टाइप करना भूल जाते हैं।

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