C / C ++ में NULL पॉइंटर के लिए जाँच [बंद]


153

हाल ही में एक कोड की समीक्षा में, एक योगदानकर्ता यह लागू करने की कोशिश कर रहा है कि 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
}

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

if (some_ptr = NULL)

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

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


32
एक सुसंगत शैली का होना कभी-कभी अधिक महत्वपूर्ण होता है कि आप किस शैली को चुनते हैं।
मार्क रैनसम

15
@ मर्क: कंसिस्टेंसी हमेशा आपकी शैली का सबसे महत्वपूर्ण कारक है।
sbi

13
"इसके अलावा मुझे लगता है कि दूसरी विधि में ilk की बग को पेश करने का एक छोटा मौका है: अगर (some_ptr = NULL)" यही कारण है कि कुछ लोग अगर (NULL == some_ptr) का उपयोग करते हैं, तो वे NULL को असाइन नहीं कर सकते हैं जो आपको मिलेगा। एक संकलन त्रुटि।
user122302

14
इन दिनों अधिकांश कंपाइलर सशर्तों में असाइनमेंट के बारे में चेतावनी देते हैं - दुर्भाग्य से बहुत सारे देवता कंपाइलर की चेतावनियों को नजरअंदाज कर देते हैं।
माइक एलरी

10
मैं ऊपर दिए गए कथन से सहमत नहीं हूं कि संगति क्या मायने रखती है। इसका संगति से कोई लेना-देना नहीं है; वैसे भी अच्छी तरह नहीं है। यह वह क्षेत्र है जहां हमें प्रोग्रामरों को अपनी शैली व्यक्त करने देना चाहिए। यदि कोई ऐसा व्यक्ति है जो तुरंत किसी भी रूप को नहीं समझता है, तो उन्हें तुरंत कोड पढ़ना बंद कर देना चाहिए और करियर परिवर्तन पर विचार करना चाहिए। मैं इससे भी अधिक कहूंगा: यदि कोई सौंदर्य प्रसाधन की स्थिरता है तो आप स्वचालित रूप से नहीं कर सकते से एक स्क्रिप्ट के साथ लागू तो इसे हटा दें। मानव नैतिक draining की लागत है रास्ता उन बेवकूफ निर्णय लोगों को एक बैठक में बनाने से अधिक महत्वपूर्ण।
विल्हेमटेल

जवाबों:


203

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

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

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


23
इसके अतिरिक्त, वे पॉइंटर रैपर क्लासेस (शेयर्ड_एप्ट्र, ऑटो_प्ट्र, स्कोप्ड_ट्रेट, आदि) के साथ संगत हैं जो आमतौर पर ऑपरेटर बूल (या सेफ_बूल) को ओवरराइड करते हैं।
सोपबॉक्स

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

2
@ ब्रायन, मैं इसका सम्मान करता हूं, और यदि "बेहतर" उत्तर आता है, तो कृपया चेक मार्क को आवश्यकतानुसार स्थानांतरित करने के लिए स्वतंत्र महसूस करें। व्यक्तिपरकता के लिए, हाँ यह व्यक्तिपरक है। लेकिन यह कम से कम एक व्यक्तिपरक चर्चा है जहां उद्देश्य संबंधी मुद्दे हैं जो प्रश्न के सामने आने पर हमेशा स्पष्ट नहीं होते हैं। रेखा धुंधली है। और व्यक्तिपरक ... ;-)
RBerteig

1
नोट करने के लिए एक महत्वपूर्ण बात: हाल ही में, मैं "if (ptr)" के बजाय "if (ptr! = NULL)" या "if (ptr! = Nullptr)" लिखने के पक्ष में था क्योंकि यह अधिक संक्षिप्त है। कोड अधिक पठनीय है। लेकिन मुझे अभी पता चला है कि तुलना हाल ही के संकलक पर NULL / nullptr के साथ तुलना के लिए चेतावनी (सम्मान) उठाती है। इसलिए यदि आप एक पॉइंटर की जांच करना चाहते हैं, तो "if (ptr)" के बजाय "if (ptr! = NULL)" करना बेहतर होगा। यदि आप गलत तरीके से एक उदाहरण के रूप में ptr की घोषणा करते हैं, तो पहला चेक चेतावनी / त्रुटि को बढ़ाएगा, जबकि बाद वाला बिना किसी चेतावनी के संकलन करेगा।
अरनौद

1
@ दाविद No वोंग नहीं, वह नहीं था जिसका मतलब था। उस पृष्ठ पर उदाहरण दो लाइन अनुक्रम है int y = *x; if (!x) {...}जहां ऑप्टिमाइज़र को इस कारण से अनुमति दी जाती है कि चूंकि NULL है, *xयदि अपरिभाषित होगा x, तो यह NULL नहीं होना !xचाहिए और इसलिए FALSE होना चाहिए। अभिव्यक्ति !ptrहै व्यवहार अपरिभाषित। उदाहरण में, यदि परीक्षण किसी भी उपयोग से पहले किया गया था *x, तो परीक्षण को खत्म करने के लिए ऑप्टिमाइज़र गलत होगा।
RBerteig

52

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


25

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

C ++ में

NULL को C ++ में 0 या 0L के रूप में परिभाषित किया गया है।

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

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

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

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

if(some_ptr){;}

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

if(some_ptr != 0){;}

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

if(some_ptr != NULL){;}

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

if(some_ptr != nullptr){;}

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

सी में

C एक अलग जानवर है।

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

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

इस दृष्टिकोण से मैं संभवतः NULLसी में मैक्रो परिभाषा का उपयोग करने की सलाह दूंगा।


tl; डॉ। और यद्यपि आप 0C ++ के बारे में सही हैं , लेकिन इसका C: में अर्थ है (void *)0। C ++ में 0बेहतर है NULL, क्योंकि टाइप त्रुटियाँ PITA हो सकती हैं।
मैट जॉइनर

@ मैट: लेकिन NULLवैसे भी शून्य है।
GManNickG

@ मेन: मेरे सिस्टम पर नहीं: #define NULL ((void *)0)सेlinux/stddef.h
मैट जॉइनर

@ मैट: सी ++ में। आपने कहा 0 बेहतर है, लेकिन NULLशून्य होना चाहिए।
GManNickG

यह एक अच्छा बिंदु है, मैंने इसका उल्लेख करने की उपेक्षा की है और मैं इसका सुझाव देकर अपना उत्तर सुधार रहा हूं। ANSI C को NULL के रूप में परिभाषित किया जा सकता है ((शून्य *) 0), C ++ NULL को 0. के रूप में परिभाषित करता है, मैंने इसके लिए मानक को सीधे नहीं लिया है, लेकिन मेरी समझ यह है कि C ++ NULL में 0 या 0L हो सकता है।
एम 2 एमएम

19

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

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

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

C ++ 0x में ध्यान दें, हम कर सकते हैं if (ptr == nullptr)जो मेरे लिए, करता है पढ़ने के लिए अच्छे। (फिर से, मैं मैक्रो से नफरत करता हूं। लेकिन nullptrअच्छा है।) मैं अभी भी करता हूं if (ptr), हालांकि, सिर्फ इसलिए कि मैं इसका उपयोग करता हूं।


आशा है कि अतिरिक्त 5 वर्षों के अनुभव ने आपका मन बदल दिया :) अगर C ++ / C में ऑपरेटर कुछ होता जैसे if_exist (), तो यह समझ में आता है।
मगुल्ला

10

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

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

int f(void* p)
{
    if (!p) { return -1; }

    // p is not null
    return 0;
}

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


किसी ने यहां बताया कि कुकुरुकु .//ub/programming/i-do-not-know-c जो if(!p)अपरिभाषित व्यवहार है यह काम कर सकता है या नहीं।
डेविड David वोंग

@ डेविड if वोंग यदि आप उस लिंक पर उदाहरण # 2 के बारे में बात कर रहे हैं, if(!p)तो अपरिभाषित व्यवहार नहीं है, यह इससे पहले की पंक्ति है। और if(p==NULL)ठीक वही समस्या होगी।
मार्क रैनसम

8

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

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

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


7

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

लेकिन मुझे लगता है कि एक अच्छा नामकरण सम्मेलन इस तर्क को गलत बनाता है।


4

दरअसल, मैं दोनों वेरिएंट का इस्तेमाल करता हूं।

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

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


1
मुझे व्यक्तिगत रूप से एरो कोड से नफरत है जो कि एक निकास बिंदु का उपयोग करेगा। यदि मुझे पहले से ही उत्तर पता है तो बाहर क्यों न निकलें?
रसिक

1
@ruslik: C (या C-with-classes शैली C ++) में, कई रिटर्न होने से सफाई कठिन हो जाती है। "वास्तविक" C ++ में यह स्पष्ट रूप से एक गैर-मुद्दा है क्योंकि आपका क्लीनअप RAII द्वारा संभाला जाता है, लेकिन कुछ प्रोग्रामर (अधिक या कम वैध कारणों के लिए) अतीत में फंस गए हैं, और या तो मना कर देते हैं, या RAII पर भरोसा नहीं करते हैं ।
जल्पफ

ऐसे मामलों में @jalf gotoबहुत काम आ सकता है। इसके अलावा कई मामलों में malloc()सफाई की आवश्यकता होती है जिसे तेजी से बदला जा सकता है alloca()। मुझे पता है कि वे अनुशंसित नहीं हैं, लेकिन वे एक कारण से मौजूद हैं (मेरे द्वारा, एक अच्छी तरह से नामित लेबल gotoएक मोटे if/elseपेड़ की तुलना में बहुत साफ है )।
ruslik

1
allocaगैर-मानक और पूरी तरह से गैर-सुरक्षित है। यदि यह विफल हो जाता है, तो आपका कार्यक्रम अभी चल रहा है। वसूली का कोई मौका नहीं है, और चूंकि स्टैक अपेक्षाकृत छोटा है, इसलिए विफलता की संभावना है। असफलता पर, यह संभव है कि आप ढेर को बंद कर दें और विशेषाधिकार-समझौता कमजोरियों का परिचय दें। कभी भी उपयोग allocaया वीलस न करें जब तक कि आपके पास आकार पर एक छोटा सा बाउंड न हो जो आवंटित किया जाएगा (और फिर आप बस एक सामान्य सरणी का उपयोग कर सकते हैं)।
आर .. गिटहब स्टॉप हेल्पिंग ICE

4

आकस्मिक प्रोग्रामिंग से बचने के लिए C प्रोग्रामिंग लैंग्वेज (K & R) ने आपको null == ptr के लिए चेक किया होगा।


23
K & R यह भी पूछेगा कि "स्मार्ट पॉइंटर क्या है?" सी ++ दुनिया में चीजें बदल रही हैं।
एलेक्स एमिलियनोव

2
या यों कहें, चीजें पहले से ही C ++ की दुनिया में बदल चुकी हैं ";)
jalf

3
K & R राज्य कहां (रेफ) है? वे कभी भी इस शैली का उपयोग नहीं करते हैं। K & R2 के अध्याय 2 में वे if (!valid)ऊपर भी सलाह देते हैं if (valid == 0)।
schot

6
बस्ती, लोग। उन्होंने कहा कि कश्मीर एंड आर, केएंडआर नहीं। वे स्पष्ट रूप से कम प्रसिद्ध हैं क्योंकि उनके शुरुआती भी पूंजीकृत नहीं हैं।
jmucchiello

1
पूंजीकरण आपको धीमा कर देता है
डेरेक

3

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

और ऐसा नहीं है कि यह मायने रखता है, लेकिन मेरी व्यक्तिगत प्राथमिकता है 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

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

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


1

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


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

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

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

या

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

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

सुनिश्चित करें कि आप सूचक पर एक अशक्त जाँच करें।


2
यह सच है कि पॉइंटर्स बूलियन नहीं हैं, लेकिन सी में, अगर-स्टेटमेंट बूलियन नहीं लेते हैं: वे पूर्णांक अभिव्यक्ति लेते हैं।
केन

@Ken: ऐसा इसलिए है क्योंकि C उस संबंध में टूट गया है। वैचारिक रूप से, यह एक बूलियन अभिव्यक्ति है और (मेरी राय में) इस तरह से व्यवहार किया जाना चाहिए।
जेरेमीपीप

1
कुछ भाषाओं में if-statement होते हैं जो केवल null / not-null के लिए परीक्षण करते हैं। कुछ भाषाओं में if-statement होते हैं जो केवल साइन के लिए पूर्णांक (3-तरफ़ा परीक्षण) का परीक्षण करते हैं। मुझे सी "टूट" पर विचार करने का कोई कारण नहीं दिखता क्योंकि उन्होंने एक अलग अवधारणा को चुना जो आपको पसंद है। सी के बारे में मुझे बहुत नफरत है, लेकिन इसका मतलब है कि सी प्रोग्राम मॉडल मेरे मानसिक मॉडल के समान नहीं है, ऐसा नहीं है कि हम में से कोई (मैं या सी) टूट गया है।
केन

@Ken: एक बूलियन एक संख्या या एक संकेतात्मक रूप से वैचारिक रूप से नहीं , नेवर माइंड कौन सी भाषा है।
जेरेमीप

1
मैंने यह नहीं कहा कि एक बूलियन एक नंबर या पॉइंटर था। मैंने कहा कि इस बात पर जोर देने का कोई कारण नहीं है कि एक इफ-स्टेटमेंट केवल एक बूलियन एक्सप्रेशन ले सकता है, और एक हाथ में एक के अलावा, काउंटरटेक्सामल की पेशकश कर सकता है। बहुत सी भाषाएं बूलियन के अलावा कुछ और लेती हैं, न कि केवल सी के "शून्य / नॉनज़रो" तरीके से। कंप्यूटिंग में, एक इफ-स्टेटमेंट जो एक बूलियन को स्वीकार करता है (केवल) एक अपेक्षाकृत हाल ही में विकास है।
केन

1

मैं तथ्य यह है कि C / C ++ प्रकार की जांच नहीं करता में बूलियन परिस्थितियों में की बहुत बड़ी प्रशंसक हूँ if, forऔर whileबयान। मैं हमेशा निम्नलिखित का उपयोग करता हूं:

if (ptr)

if (!ptr)

पूर्णांक या अन्य प्रकार पर भी जो बूल में परिवर्तित होता है:

while(i--)
{
    // Something to do i times
}

while(cin >> a >> b)
{
    // Do something while you've input
}

इस शैली में कोडिंग मेरे लिए अधिक पठनीय और स्पष्ट है। सिर्फ मेरी निजी राय।

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

unsigned char chx;

if (chx) // ...

की तुलना में अधिक कुशल है

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

क्योंकि बाद के मामले में संकलक को chx के मूल्य की तुलना 1 से करनी है। जहाँ chx केवल एक सही / गलत ध्वज है।


1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.