दिलचस्प पोस्ट
एंड्रॉइड स्टूडियो ग्रैड त्रुटि: एकाधिक डेक्स फाइलें परिभाषित करती हैं उबंटू में नोड पैकेज मैनेजर के जरिए पैकेज स्थापित नहीं किया जा सकता ASP.NET MVC कार्यों के लिए CORS Preflight अनुरोधों को प्रबंधित करना मैं अपने WPF- अनुप्रयोग में एक पृष्ठ के लिए मोडल संवाद कैसे करूं? नरम कीबोर्ड दिखाए जाने पर लेआउट्स को ले जाएं? एक फ़ेविकॉन बनाना मैक बंडल में फ़ॉन्ट एम्बेड करें जावास्क्रिप्ट में पुनरावर्ती और निष्पादन के प्रवाह के लिए एक स्पष्ट व्याख्या? GitHub में कांटे के बीच विलय टिल्ड विस्तार बश में काम नहीं कर रहा है क्या स्थानीय डाटाबेस के लिए कोई विकल्प है जैसे एस 2 के लिए सिकलाइट जेएमएम – सीएलडीसी डिवाइस? Google Maps v3 में दो बिंदुओं के बीच एक मार्ग ड्राइंग असंगत व्यवहार वार्गेंट का पोर्ट अग्रेषण काम नहीं कर रहा कैसे Firebase एंड्रॉइड से सभी बच्चे की सूची प्राप्त करने के लिए पायथन पूर्णांक को अगले सौ में पूरा करता है

C / C ++ में नल सूचक के लिए जांचना

हाल की एक कोड समीक्षा में, एक योगदानकर्ता यह लागू करने की कोशिश कर रहा है कि पॉइंटर्स पर सभी NULL जांच निम्न तरीके से की जाये:

 int * some_ptr; // ... if (some_ptr == NULL) { // Handle null-pointer error } else { // Proceed } 

के बजाय

 int * some_ptr; // ... if (some_ptr) { // Proceed } else { // Handle null-pointer error } 

मैं मानता हूं कि उनका तरीका इस अर्थ में थोड़ा अधिक स्पष्ट है कि यह स्पष्ट रूप से कह रहा है "सुनिश्चित करें कि यह संकेतक शून्य नहीं है", लेकिन मैं यह कहकर यह मुकाबला करता हूं कि जो कोई इस कोड पर काम कर रहा है, वह समझता है कि पॉइंटर वैरिएबल का उपयोग करके if कथन निहित है if NULL लिए जांच की जा रही NULL । इसके अलावा, मुझे लगता है कि दूसरी विधि में आईएलके एक बग शुरू करने का एक छोटा मौका है:

 if (some_ptr = NULL) 

जो केवल खोजने और डिबग करने के लिए एक पूर्ण दर्द है

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

वेब के समाधान से एकत्रित समाधान "C / C ++ में नल सूचक के लिए जांचना"

मेरे अनुभव में, फार्म का परीक्षण if (ptr) या if (!ptr) पसंदीदा हैं वे प्रतीक NULL की परिभाषा पर निर्भर नहीं करते हैं वे आकस्मिक असाइनमेंट के लिए अवसर का पर्दाफाश नहीं करते हैं। और वे स्पष्ट और संक्षिप्त हैं

संपादित करें: जैसा कि सोपबॉक्स एक टिप्पणी में बताता है, वे सी ++ क्लासेस जैसे कि auto_ptr के साथ संगत हैं जो ऑब्जेक्ट हैं जो पॉइंटर्स के रूप में कार्य करते हैं और जो वास्तव में इस मुहावरे को सक्षम करने के लिए एक रूपांतरण प्रदान करते हैं। इन वस्तुओं के लिए, NULL एक स्पष्ट तुलना को संकेतक के लिए एक रूपांतरण का आह्वान करना होगा, जिसमें अन्य सिमेंटिक दुष्प्रभाव हो सकते हैं या साधारण अस्तित्व की तुलना में अधिक महंगा हो सकता है कि bool रूपांतरण का अर्थ है

मेरे पास कोड के लिए प्राथमिकता है, जो कहती है कि बिना अनावश्यक पाठ के क्या मतलब है if (ptr != NULL) का अर्थ एक ही अर्थ है if (ptr) लेकिन निरर्थक विशिष्टता की कीमत पर। अगली तार्किक चीज यह है कि if ((ptr != NULL) == TRUE) लिखना है और उस तरह पागलपन होता है। सी भाषा स्पष्ट है कि if बुलियन का परीक्षण किया जाता if , while या उस while किसी गैर-शून्य मान का एक विशिष्ट अर्थ सही है और शून्य गलत है। अतिरेक यह स्पष्ट नहीं करता है

if (foo) पर्याप्त स्पष्ट है इसका इस्तेमाल करें।

मैं if (ptr) उपयोग करता हूं, लेकिन यह पूरी तरह से तर्कसंगत नहीं है,

मुझे अपना रास्ता पसंद है क्योंकि यह संक्षिप्त है, यद्यपि दूसरों का कहना है कि == NULL इसे पढ़ने और अधिक स्पष्ट करने के लिए आसान बनाता है। मैं देखता हूं कि वे कहां से आ रहे हैं, मैं बस असहमत हैं कि अतिरिक्त चीजें यह आसान बना देती हैं। (मै मैक्रो से घृणा करता हूं, इसलिए मैं पक्षपाती हूँ।) आपके ऊपर।

मैं आपके तर्क से असहमत हूं यदि आप सशर्त में असाइनमेंट के लिए चेतावनियां प्राप्त नहीं कर रहे हैं, तो आपको अपनी चेतावनी के स्तर को बदलना होगा। इतना ही आसान। (और सभी के प्यार के लिए अच्छा है, उन्हें चारों ओर स्विच न करें।)

सी ++ 0x में नोट, हम if (ptr == nullptr) कर सकते हैं, जो मेरे लिए अच्छा पढ़ा है (फिर से, मैं मैक्रो से घृणा करता हूं। लेकिन nullptr अच्छा है।) मैं अभी भी if (ptr) nullptr ) करता हूं, बस, क्योंकि यह मेरे लिए किया जाता है।

मैं इसके साथ शुरू करूँगा: स्थिरता राजा है, निर्णय आपके कोड बेस में स्थिरता से कम महत्वपूर्ण है।

सी ++ में

शून्य को सी ++ में 0 या 0 एल के रूप में परिभाषित किया गया है

यदि आपने पढ़ा है , तो सी ++ प्रोग्रामिंग भाषा बर्जनी स्ट्राउटस्ट्रैप 0 का उपयोग करके असाइनमेंट करते समय NULL मैक्रो से बचने के लिए स्पष्ट रूप से सुझाव देता है , मुझे यकीन नहीं है कि क्या उन्होंने तुलना के साथ ऐसा किया है, जब से मैं किताब पढ़ता हूं, मुझे लगता है कि वह सिर्फ if(some_ptr) एक स्पष्ट तुलना के बिना किया था, लेकिन मैं उस पर फजी हूँ

इसका कारण यह है कि NULL मैक्रो भ्रामक है (जैसा कि लगभग सभी मैक्रोज़ हैं) यह वास्तव में 0 शाब्दिक है, एक अद्वितीय प्रकार नहीं, जैसा कि नाम का सुझाव हो सकता है कि यह हो सकता है। मैक्रो से बचाव C ++ में सामान्य दिशानिर्देशों में से एक है दूसरी ओर, 0 एक पूर्णांक की तरह दिखता है और यह पॉइंटर्स की तुलना में या असाइन किए जाने पर नहीं होता है निजी तौर पर मैं किसी भी तरह से जा सकता हूं, लेकिन आम तौर पर मैं स्पष्ट तुलना छोड़ देता हूं (हालांकि कुछ लोग इसे नापसंद करते हैं, शायद यही कारण है कि आप किसी योगदानकर्ता को किसी भी बदलाव का सुझाव दे रहे हैं)।

व्यक्तिगत भावनाओं के बावजूद यह काफी हद तक कम से कम बुराई का विकल्प है क्योंकि एक सही विधि नहीं है।

यह स्पष्ट और आम मुहावरा है और मैं इसे पसंद करता हूं, तुलना के दौरान गलती से एक मूल्य निर्दिष्ट करने की कोई संभावना नहीं है और यह स्पष्ट रूप से पढ़ता है:

 if(some_ptr){;} 

यह स्पष्ट है यदि आप जानते हैं कि some_ptr एक सूचक प्रकार है, लेकिन यह एक पूर्णांक तुलना की तरह दिख सकता है:

 if(some_ptr != 0){;} 

यह स्पष्ट है, आम मामलों में यह समझ में आता है … लेकिन यह एक गड़बड़ अमूर्त है, NULL वास्तव में 0 और इसे आसानी से दुरुपयोग किया जा सकता है:

 if(some_ptr != NULL){;} 

सी ++ 0x में नलप्टर है जो अब पसंदीदा विधि है क्योंकि यह स्पष्ट और सटीक है, बस आकस्मिक असाइनमेंट के बारे में सावधान रहें:

 if(some_ptr != nullptr){;} 

जब तक आप सी ++ 0x में माइग्रेट करने में सक्षम नहीं हो जाते, तब तक मैं तर्क करता हूं कि आप इन विधियों में से किस प्रकार का उपयोग करते हैं, इसके बारे में चिंतित समय की बर्बादी है, वे सभी अपर्याप्त हैं, इसलिए यही कारण है कि nullptr का आविष्कार किया गया था (सामान्य प्रोग्रामिंग मुद्दों के साथ जो सही फ़ॉरवर्डिंग ।) सबसे महत्वपूर्ण बात स्थिरता बनाए रखना है

सी में

सी एक अलग जानवर है

सी नल में 0 या ((शून्य *) 0) के रूप में परिभाषित किया जा सकता है, C99 कार्यान्वित परिभाषित नल सूचक स्थिरांक के लिए अनुमति देता है। तो यह वास्तव में कार्यान्वयन की परिभाषा के नीचे आता है और आपको इसे अपने मानक पुस्तकालय में निरीक्षण करना होगा।

मैक्रोज़ बहुत आम हैं और सामान्य तौर पर उन्हें भाषा और अन्य चीज़ों में जेनेरिक प्रोग्रामिंग समर्थन की कमी के लिए बहुत कुछ किया जाता है। भाषा बहुत सरल है और प्री-प्रोसेसर पर निर्भरता अधिक आम है

इस परिप्रेक्ष्य से मैं शायद सी में NULL मैक्रो परिभाषा का प्रयोग करने की सिफारिश करता हूं।

सच कहूँ तो, मुझे नहीं लगता कि यह क्यों मायने रखता है या तो एक बहुत स्पष्ट है और सी या सी ++ के साथ किसी भी रूप में अनुभवी किसी भी व्यक्ति को दोनों को समझना चाहिए। एक टिप्पणी, यद्यपि:

यदि आप त्रुटि को पहचानने की योजना बनाते हैं और फ़ंक्शन निष्पादित नहीं करते हैं (यानी, आप एक अपवाद फेंक सकते हैं या तुरंत त्रुटि कोड लौटा रहे हैं), तो आपको इसे एक गार्ड क्लॉज बनाना चाहिए:

 int f(void* p) { if (!p) { return -1; } // p is not null return 0; } 

इस तरह, आप "एरो कोड" से बचें।

असल में, मैं दोनों रूपों का उपयोग करता हूं

ऐसी स्थितियां हैं, जहां आप पहली बार पॉइंटर की वैधता की जांच करते हैं, और यदि यह नल है, तो आप फ़ंक्शन के बाहर / बाहर निकलते हैं। (मुझे पता है कि इससे चर्चा हो सकती है "फ़ंक्शन के पास केवल एक एक्जिट प्वाइंट होना चाहिए")

ज्यादातर समय, आप संकेतक की जांच करते हैं, फिर आप जो करना चाहते हैं, उसके बाद त्रुटि केस को हल करें। परिणाम बदसूरत एक्स-टाइम इंडेंट कोड हो सकता है, यदि कई के साथ।

व्यक्तिगत रूप से मैंने हमेशा उपयोग किया if (ptr == NULL) क्योंकि यह मेरी मंशा स्पष्ट बनाता है, लेकिन इस समय यह सिर्फ एक आदत है

== स्थान पर = का उपयोग किसी भी सक्षम कंपाइलर द्वारा सही चेतावनी सेटिंग्स के साथ पकड़ा जाएगा।

महत्वपूर्ण बात यह है कि आपके समूह के लिए एक सुसंगत शैली चुनना और उसे छड़ी करना। कोई फर्क नहीं पड़ता कि आप किस तरह से जाते हैं, आप अंततः इसका इस्तेमाल करेंगे, और दूसरे लोगों के कोड में काम करते समय घर्षण की क्षति का स्वागत किया जाएगा।

अगर शैली और प्रारूप आपकी समीक्षाओं का हिस्सा बनने जा रहे हैं, तो इसके खिलाफ उपाय करने के लिए शैली मार्गदर्शिका पर सहमति होनी चाहिए। अगर वहाँ एक है, क्या शैली गाइड कहते हैं। अगर वहाँ एक नहीं है, इस तरह के विवरणों को छोड़ दिया जाना चाहिए क्योंकि वे लिखे गए हैं। यह समय और ऊर्जा की बर्बादी है, और कौन सी कोड समीक्षाओं को वास्तव में उजागर करना चाहिए से distracts। गंभीरता से, एक स्टाइल गाइड के बिना, मैं इस तरह से सिद्धांत को एक सिद्धांत के रूप में बदल नहीं सकता, यहां तक ​​कि जब यह सम्मेलन मुझे पसंद करता है तब भी मैं इसका उपयोग नहीं करता।

और ऐसा नहीं है कि यह मायने रखता है, लेकिन मेरी निजी प्राथमिकता है if (ptr) । इसका अर्थ मेरे लिए और भी तुरंत स्पष्ट है if (ptr == NULL)

हो सकता है कि वह यह कहने की कोशिश कर रहा है कि खुशियों से पहले त्रुटि की स्थिति को संभालना बेहतर होगा? उस स्थिति में मैं अभी भी समीक्षक से सहमत नहीं हूं मुझे नहीं पता है कि इसके लिए एक स्वीकृत सम्मेलन है, लेकिन मेरी राय में सबसे ज्यादा "सामान्य" स्थिति किसी भी अगर बयान में पहले आनी चाहिए। इस तरह मुझे यह पता लगाने में कम खुदाई मिल रही है कि फ़ंक्शन क्या है और यह कैसे काम करता है।

इस बात का अपवाद है कि अगर त्रुटि मुझे समारोह से जमानत दे देती है, या आगे बढ़ने से पहले मैं इसे पुनर्प्राप्त कर सकता हूं। उन मामलों में, मैं पहले त्रुटि को संभालता हूं:

 if (error_condition) bail_or_fix(); return if not fixed; // If I'm still here, I'm on the happy path 

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

लेकिन अगर यह एक स्टाइल गाइड में नहीं है तो यह सिर्फ मेरी राय है, और आपकी राय वैसी मान्य है। या तो मानकीकृत या न करें। किसी समीक्षक को छद्म मानकीकरण न दें, क्योंकि उसे राय मिल गई है

foo == NULL अभ्यास के पक्ष में सिर्फ एक और बिंदु: यदि foo कहता है, एक int * या एक bool * , तो if (foo) चेक गलती से पाठक द्वारा पॉइन्टेई के मूल्य की जांच के रूप में व्याख्या की जा सकती है, यानी जैसे if (*foo) NULL तुलना यहाँ एक चेतावनी है कि हम एक संकेतक के बारे में बात कर रहे हैं।

लेकिन मुझे लगता है कि एक अच्छा नामकरण सम्मेलन यह तर्क विवाद करता है।

सी प्रोग्रामिंग लैंग्वेज (के एंड आर) में आप एक असामान्य असाइनमेंट से बचने के लिए रिक्त == पीटीआर के लिए जांच करेंगे।

मुझे लगता है यह काफी स्पष्ट है:

 if( !some_ptr ) { // handle null-pointer error } else { // proceed } 

इसे "यदि कोई संकेतक नहीं है …" के रूप में पढ़ें

इसके अतिरिक्त, यह संक्षिप्त है और इसमें आकस्मिक कार्य का कोई खतरा नहीं है।

यह उन दोनों भाषाओं के बुनियादी सिद्धांतों में से एक है, जो संकेत एक प्रकार और मूल्य का मूल्यांकन करते हैं जिसका इस्तेमाल नियंत्रण अभिव्यक्ति के रूप में किया जा सकता है, सी में C ++ और int में सी। बस इसे उपयोग करें

मैं इस तथ्य का एक बड़ा प्रशंसक हूं कि सी / सी ++ में बूलियन स्थितियों में प्रकार की जांच नहीं की जाती है, if और के for वक्तव्य मैं हमेशा निम्न का उपयोग करता हूं:

 if (ptr) if (!ptr) 

यहां तक ​​कि पूर्णांक या अन्य प्रकार से भी जो bool में धर्मान्तरित होता है:

 while(i--) { // Something to do i times } while(cin >> a >> b) { // Do something while you've input } 

इस शैली में कोडिंग मुझे और अधिक पठनीय और स्पष्ट है। बस मेरी व्यक्तिगत राय

हाल ही में, ओकेआई 431 माइक्रोकंट्रोलर पर काम करते समय, मैंने पाया है कि निम्नलिखित:

 unsigned char chx; if (chx) // ... 

अधिक से अधिक कुशल है

 if (chx == 1) // ... 

क्योंकि बाद के मामले में कंपाइलर को 1 से चक्स के मान की तुलना करना पड़ता है। जहां च्क्स सिर्फ एक सच्चा है / झंडा झंडा है।

मैंने उपयोग किए गए अधिकांश कंपलर कम से कम चेतावनी देते हैं कि if बिना सिंटैक्स चीनी के काम किया है, तो मैं उस तर्क को नहीं खरीदता। उसने कहा, मैंने दोनों पेशेवरों का इस्तेमाल किया है और मेरे लिए कोई प्राथमिकता नहीं है। == NULL स्पष्ट रूप से मेरी राय में हालांकि स्पष्ट है

  • संकेतक बूलियन नहीं हैं
  • आधुनिक सी / सी + + कम्पाइलर एक चेतावनी का उत्सर्जन करते हैं जब आप दुर्घटना से if (foo = bar) लिखते हैं।

इसलिए मुझे पसंद है

 if (foo == NULL) { // null case } else { // non null case } 

या

 if (foo != NULL) { // non null case } else { // null case } 

हालांकि, अगर मैं शैली के दिशा निर्देशों का एक सेट लिख रहा था तो मैं इसमें इस तरह की बातें नहीं डालूंगा, मैं ऐसी चीजों को लगाऊंगा:

सुनिश्चित करें कि आप सूचक पर एक निरर्थक जांच करते हैं।