नल नोड्स का प्रतिनिधित्व करने के लिए NIL का उपयोग करने का उद्देश्य क्या है?


17

मेरे एल्गोरिथ्म और डेटा संरचना पाठ्यक्रम में, प्रोफेसरों, स्लाइड्स और पुस्तक ( परिचय के लिए एल्गोरिथ्म, 3 डी संस्करण ) शब्द NILका उपयोग कर रहे हैं उदाहरण के लिए नोड के एक बच्चे (एक पेड़ में) मौजूद है जो मौजूद नहीं है।

एक बार, एक व्याख्यान के दौरान, कहने के बजाय NIL, मेरे सहपाठी ने कहा null, और प्रोफेसर ने उसे ठीक किया, और मुझे समझ नहीं आया कि प्रोफेसर इस शब्द पर क्यों जोर देते हैं।

क्यों लोग शब्द का उपयोग एक कारण है NILके बजाय null, या none, या किसी अन्य शब्द? क्या NILकुछ विशेष अर्थ हैं जो दूसरों के पास नहीं हैं? क्या कोई ऐतिहासिक कारण है?

ध्यान दें कि मैंने वेब के आसपास कुछ स्थानों को भी देखा है, जैसे, शब्द nullका उपयोग इसके बजाय किया गया था NIL, लेकिन आमतौर पर यह अंतिम उपयोग किया जाता है।

जवाबों:


25

जहां तक मेरा सवाल है, null, nil, noneऔर nothingइसी अवधारणा के लिए आम नाम कर रहे हैं: जो "एक मूल्य के अभाव" का प्रतिनिधित्व करता है एक मूल्य है, और जो कई अलग अलग प्रकार में मौजूद है (बुलाया नल प्रकार )। यह मान आमतौर पर उपयोग किया जाता है जहां एक मूल्य सामान्य रूप से मौजूद होता है, लेकिन छोड़ा जा सकता है, उदाहरण के लिए एक वैकल्पिक पैरामीटर। विभिन्न प्रोग्रामिंग भाषाएं इसे अलग तरीके से लागू करती हैं, और कुछ भाषाओं में ऐसी कोई अवधारणा नहीं हो सकती है। पॉइंटर्स वाली भाषाओं में, यह ए अशक्त सूचक है । कई ऑब्जेक्ट-ओरिएंटेड भाषाओं में, नल एक ऑब्जेक्ट नहीं है: इस पर किसी भी विधि को कॉल करना एक त्रुटि है। कुछ उदाहरण देने के लिए:

  • लिस्प में, nilआमतौर पर मूल्य की अनुपस्थिति के लिए खड़े होने के लिए उपयोग किया जाता है। अधिकांश अन्य भाषाओं के विपरीत, nilसंरचना है - यह एक प्रतीक है जिसका नाम है "NIL"। यह खाली सूची भी है (क्योंकि एक सूची में एक सामान्य सेल होना चाहिए, लेकिन कभी-कभी कोई वाणिज्य कक्ष नहीं होता है क्योंकि सूची खाली है)। चाहे वह हुड के नीचे एक नल सूचक द्वारा लागू किया गया हो, या किसी अन्य की तरह एक प्रतीक के रूप में, कार्यान्वयन-निर्भर है।
  • पास्कल में, nilएक पॉइंटर वैल्यू (किसी भी पॉइंटर टाइप में मान्य) हो सकता है जो कि डिरेल्ड न हो।
  • C और C ++ में, किसी भी पॉइंटर प्रकार में एक NULLमान शामिल होता है जो किसी भी पॉइंटर से एक मान्य ऑब्जेक्ट के लिए अलग होता है।
  • स्मालटाक में, nilएक ऐसी वस्तु है जिसे कोई विधि परिभाषित नहीं है।
  • जावा में और C # में, null किसी भी ऑब्जेक्ट प्रकार का एक मूल्य है। किसी क्षेत्र या पद्धति को एक्सेस करने का कोई भी प्रयास nullअपवाद को ट्रिगर करता है।
  • पर्ल में, undef किसी भी अन्य स्केलर मूल्य से अलग है और "वास्तविक" मूल्य की अनुपस्थिति को इंगित करने के लिए भाषा और पुस्तकालय में उपयोग किया जाता है।
  • पायथन में, None किसी भी अन्य मूल्य से अलग है और "वास्तविक" मूल्य की अनुपस्थिति को इंगित करने के लिए भाषा और पुस्तकालय में उपयोग किया जाता है।
  • ML (SML, OCaml) Noneमें, टाइप स्कीम में किसी भी प्रकार का मान 'a optionहोता है, जिसमें किसी भी प्रकार का Noneऔर Some xकिसी भी xप्रकार का होता है'a
  • हास्केल में, समान अवधारणा नामों Nothingऔर Just xमूल्यों के Maybe aलिए और प्रकार के लिए उपयोग करती है।

एल्गोरिथ्म प्रस्तुतियों में, प्रस्तोता की पृष्ठभूमि या कोड उदाहरणों में उपयोग की जाने वाली भाषा से स्टेम करने के लिए किस नाम का उपयोग किया जाता है।

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

यह संभव है कि आपका व्याख्याता nullपाठ्यक्रम (जावा या सी #?) में उपयोग की जाने वाली प्रोग्रामिंग भाषा में एक अशक्त पॉइंटर निरंतर के लिए शब्द का उपयोग करना चाहता है , और NILकुछ डेटा संरचनाओं में नोड की अनुपस्थिति को निरूपित करना है, जिसे लागू किया जा सकता है या नहीं। एक अशक्त सूचक स्थिरांक के रूप में (उदाहरण के लिए, जैसा कि ऊपर देखा गया है, लिस्प में,NIL अक्सर एक अशक्त सूचक के रूप में लागू नहीं किया जाता है)। डेटा संरचनाओं के कार्यान्वयन तकनीकों पर चर्चा करते समय यह अंतर प्रासंगिक होगा। जब स्वयं डेटा संरचनाओं की चर्चा करते हैं, तो नल-पॉइंटर-स्थिर अवधारणा अप्रासंगिक है, केवल-नहीं-से-किसी भी-अन्य-मूल्य अवधारणा मामलों के लिए।

कोई मानक नामकरण योजना नहीं है। एक अन्य व्याख्याता या पाठ्यपुस्तक विभिन्न नामों का उपयोग कर सकती है।


दो और उदाहरण। उद्देश्य सी में दोनों NULL(सी संगतता के लिए) और हैं nil; कॉलिंग मेथड्स nilनो-ऑप है। जावास्क्रिप्ट में दोनों null(कुछ भी नहीं का प्रतिनिधित्व करने वाला एक मूल्य) और undefined(मान भी सेट नहीं है)।
200_success

1
"ऑब्जेक्ट-ओरिएंटेड भाषाओं में, नल एक ऑब्जेक्ट नहीं है: इस पर किसी भी विधि को कॉल करना एक त्रुटि है।" - यह सभी भाषाओं के लिए सही नहीं है, जिसमें आपके द्वारा सूचीबद्ध कुछ भाषाएं भी शामिल हैं। रूबी और स्मालटाक में, nilकिसी भी अन्य की तरह एक वस्तु है, इसका एक उदाहरण है NilClass, "नल-नेस" की कोई अन्य अवधारणा नहीं है, और विशेष रूप से, कोई अशक्त-सूचक नहीं है। स्काला में, Nilसे बहुत अलग है null, nullएक अशक्त-नाल-सूचक की तरह थोथा है, हालांकि, इसका वास्तव में एक प्रकार है ( Null), Nilएक नियमित रूप से पुरानी वस्तु है, EmptyListयदि आप चाहें तो कक्षा का सिंगलटन उदाहरण है , और वहाँ भी है ...
जोर्ग डब्ल्यू मित्तग

1
... Nothingजो नीचे का प्रकार है और जिसका कोई उदाहरण नहीं है, और Unitजो सबरूटीन्स का प्रकार है जो एक मान नहीं लौटाता है और इसमें सिंगलटन उदाहरण है ()nullकिसी तरह इसे "अशक्त सूचक" या "अशक्त संदर्भ" की धारणा के साथ ले जाता है, इसलिए नहीं कि यह किसी भी तरह से शब्द में निहित है, बल्कि केवल इसलिए कि सी, सी ++, डी, जावा, सी # जैसी भाषाओं की सर्वव्यापकता है, जो इस में इसका उपयोग करते हैं तौर तरीका। NILभले ही यह वास्तव में पास्कल, मोडुला -2 और ओबेरॉन में इस तरह से उपयोग किया जाता है, भले ही इस अर्थ को आगे नहीं बढ़ाया जाता है। रूबी में, nilकई उपयोगी तरीकों है: nil.to_i # => 0, nil.to_s # => '', ...
Jörg डब्ल्यू Mittag

1
... nil.to_a # => [], nil.to_h # => {}, nil.to_f # => 0.0, nil.inspect # => 'nil', और इतने पर। आप पूरी सूची यहां देख सकते हैं ।
जोर्ग डब्ल्यू मित्तग

3

मेरा मानना है कि शून्य और अशक्त दोनों के उपयोग का कारण यह है कि पूर्व मुख्य रूप से एक संज्ञा है, और उत्तरार्द्ध मुख्य रूप से एक विशेषण है (मैंने वेब पर और मेरे पेपर डिक्शनरी: अमेरिकन हेरिटेज 1992 में जाँच की)।

अर्थ और इतिहास के बारे में, NIL लैटिन "निहिल" से एक संकुचन है जिसका अर्थ है "कुछ भी नहीं"।

मेरी जानकारी के लिए, nilएक शून्य सूचक को निरूपित करने के लिए नाम का उपयोग प्रोग्रामिंग भाषा लिस्प (1958) के साथ पेश किया गया था ।

एक नल पॉइंटर एक सूचक मूल्य कि कुछ भी नहीं करने के लिए बात करने के लिए माना जाता है है, और इस तरह dereferenced नहीं किया जाना चाहिए। ज्यादातर मामलों में, पॉइंटर्स केवल मेमोरी एड्रेस होते हैं। किसी भी चर (यानी, किसी भी स्थान) को ऐसे पॉइंटर को शामिल करने का इरादा होता है जिसमें हमेशा बिट्स के कुछ कॉन्फ़िगरेशन होते हैं, और ऐसे किसी भी कॉन्फ़िगरेशन को मेमोरी एड्रेस के रूप में पढ़ा जा सकता है। इसलिए यह अक्सर ऐसा होता है कि मान nilएक मेमोरी क्षेत्र का पता होगा जो प्रोग्राम के लिए मना किया जाता है, इस प्रकार विफलता के कुछ रूप का कारण बनता है (संभवतः व्यवधान) यदि प्रोग्राम डीरेफेरेंस का प्रयास करता है nil, जो केवल एक त्रुटि हो सकती है।

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

यह किसी सूची की पुनरावर्ती परिभाषा से मेल खाता है या तो एक खाली सूची, या सूची तत्व जो किसी सूची में सम्‍मिलित है। इसलिए बिना किसी तत्व के एक सूची का प्रतिनिधित्व किया गया था nil। यह खाली सूची, सूची की पहचान के लिए होती है।

चूंकि सूचियों का उपयोग सेटों का प्रतिनिधित्व करने के लिए किया जा सकता है, इसलिए उस स्थिति में खाली सेट का भी प्रतिनिधित्व किया जा सकता है nil

इस प्रकार nilऐतिहासिक रूप से एक विशेष सूचक मूल्य था, लेकिन अन्य अधिक अमूर्त डोमेन के लिए एक विशेष पहचान मूल्य के रूप में समझा गया, जैसे कि सूची या सेट।

एक संकेतक के बराबर nilएक शून्य सूचक था, एक मूल (यानी एक संज्ञा) के बजाय एक विशेषण होने के कारण अशक्त था।

विशेषण और संज्ञा के रूप में दोनों शब्द का समन्वित उपयोग अन्य अभ्यास के साथ काफी सुसंगत है। क्वालीफायर नल का उपयोग अक्सर बीजगणितीय संरचना के शून्य के लिए किया जाता है, जैसे कि एक मोनोइड की पहचान: शून्य तत्व । सूचियाँ एक मोनॉइड बनाती हैं , जहाँ मान शून्य पहचान है। वही सेट का सच है (हालांकि वे कई और गुणों के साथ एक बीजगणित बनाते हैं)। एक जैसा कहता है कि एक पूर्णांक शून्य है जब यह शून्य है।

इन शब्दों के उपयोग पर बहुत सारी विविधताएं हैं, जैसे कि प्रोग्रामिंग भाषाओं के लेखकों और अज्ञात लोगों के आधार पर कोई भी नहीं।

जैसा कि ऊपर बताया गया है, दो प्रमुख अर्थ हैं

  • एक मानक "अपरिभाषित मूल्य" के रूप में, वास्तव में किसी भी प्रयोग करने योग्य मूल्य की अनुपस्थिति का प्रतिनिधित्व करता है।

  • कुछ डोमेन के पहचान मूल्य के रूप में

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

दोनों अवधारणाएं अलग-अलग हैं, भले ही हमने ऊपर दिखाया है कि वे संबंधित हो सकते हैं। यह देखने के लिए दिलचस्प हो सकता है कि गाइल्स'आर्क द्वारा उल्लिखित शब्दावली के उपयोग की एक विस्तृत विस्तृत वर्गीकरण है, यह देखने के लिए कि इनमें से प्रत्येक शब्द का उपयोग एक अर्थ या दूसरे की ओर अधिक उन्मुख है या नहीं।

नाम दिए गए संदर्भ को परिभाषित करने के लिए किसी भी अधिक से अधिक नहीं हैं जो उन्हें दिए गए संदर्भ में अर्थ के लिए सौंपा गया है। कुछ उपयोग अधिक सामान्य, अधिक प्राकृतिक, या अधिक सुसंगत हैं, लेकिन किसी को हमेशा परिभाषाओं की जांच करनी चाहिए और यह सुनिश्चित करना चाहिए कि प्रत्येक संदर्भ में क्या अर्थ था। और किसी को हमेशा स्वाद या स्थिरता के साथ शब्दावली का चयन करने की उम्मीद नहीं करनी चाहिए।


0

एनआईएल एक ऐसी वस्तु है जिसका मूल्य प्रोग्रामर को बताता है कि वस्तु वैध नहीं है। यह C ++ में विशेष रूप से उपयोगी है जहाँ NULL को 0. के रूप में परिभाषित किया गया है। यदि आप C ++ में NULL को संदर्भित करते हैं, तो आपको अपरिभाषित व्यवहार मिलता है। यदि आप एनआईएल को संदर्भित करते हैं (एक खाली वस्तु के लिए एक संकेतक जिसे आपने परिभाषित किया था), तो आपको एक वस्तु मिलती है जिसे आप बता सकते हैं कि आपके डेटा संरचना के अंत से परे है। यह भयावह कार्यक्रम की विफलता को रोकने और त्रुटियों का पता लगाने के लिए बहुत अच्छा है।

आप एनआईएल का उपयोग दोहरी-लिंक्ड सूचियों जैसे मामलों में कर सकते हैं, यह सूची की शुरुआत और अंत दोनों सिर और पूंछ का ट्रैक रखने के लिए हो सकता है, और सुनिश्चित करें कि -> अगला और -> प्रचलित संकेत कभी भी NULL का संदर्भ नहीं लेते हैं।


जहाँ तक मैं देख सकता हूँ, यह केवल गलत है। C ++ में कोई "NIL" नहीं है
डेविड रिचेर्बी

1
मुझे लगता है कि आपने मेरे जवाब का गलत मतलब निकाला। आपके द्वारा प्रदत्त लिंक का मेरे उत्तर के साथ कोई संबंध नहीं है। मैंने प्रस्तावित किया कि शून्य एक उपयोगकर्ता-परिभाषित वस्तु है, जो उस वर्ग के खाली (लेकिन मान्य) ऑब्जेक्ट को इंगित करने के लिए, प्रति-वर्ग के आधार पर परिभाषित है।
18

जिस तरह से आप लिखना "शून्य है (मेरे जोर) के बजाय, का कहना है कि बनाता है यह देखने के लिए की तरह अगर आप प्रोग्रामिंग की एक शैली की तुलना में एक भाषा सुविधा का वर्णन कर रहे हैं" शून्य एक वस्तु के रूप में परिभाषित किया जा सकता है "एक वस्तु"। हालाँकि, यदि आपका उत्तर विशुद्ध रूप से एक प्रोग्रामिंग शैली के बारे में है, तो यह वास्तव में विषय पर नहीं है, यहाँ है।
डेविड रिचेर्बी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.