उन मूल सिद्धांतों को प्राप्त करने की तलाश में जहां शब्द " शून्य " से आता है, और इसे शून्य क्यों कहा जाता है। प्रश्न का उद्देश्य किसी ऐसे व्यक्ति की सहायता करना है जिसे कोई सी अनुभव नहीं है, और अचानक सी-आधारित कोडबेस को देख रहा है।
उन मूल सिद्धांतों को प्राप्त करने की तलाश में जहां शब्द " शून्य " से आता है, और इसे शून्य क्यों कहा जाता है। प्रश्न का उद्देश्य किसी ऐसे व्यक्ति की सहायता करना है जिसे कोई सी अनुभव नहीं है, और अचानक सी-आधारित कोडबेस को देख रहा है।
जवाबों:
मूल रूप से इसका अर्थ है "कुछ भी नहीं" या "कोई प्रकार नहीं"
शून्य उपयोग करने वाले 3 मूल तरीके हैं:
फ़ंक्शन तर्क: int myFunc(void)
- फ़ंक्शन कुछ भी नहीं लेता है।
फ़ंक्शन रिटर्न मान: void myFunc(int)
- फ़ंक्शन कुछ भी नहीं देता है
जेनेरिक डेटा पॉइंटर: void* data
- 'डेटा' अज्ञात प्रकार के डेटा के लिए एक पॉइंटर है, और इसे डिरेल नहीं किया जा सकता है
नोट: void
एक फ़ंक्शन तर्क में C ++ में वैकल्पिक है, इसलिए int myFunc()
बिल्कुल उसी के समान है int myFunc(void)
, और इसे पूरी तरह से C # में छोड़ दिया गया है। यह हमेशा एक वापसी मूल्य के लिए आवश्यक है।
मैंने हमेशा अनुपस्थित रहने के लिए इसे लिया है । यहां सी भाषा में चार मामले हैं जो अनुपस्थित के इस उपयोग से मेल खाते हैं
R f(void)
- फ़ंक्शन पैरामीटर अनुपस्थित हैंvoid f(P)
- रिटर्न वैल्यू अनुपस्थित हैvoid *p
- जो इंगित किया गया है उसका प्रकार अनुपस्थित है(void) p
- मूल्य का उपयोग अनुपस्थित हैअन्य C वंशज अन्य चीजों के लिए इसका उपयोग करते हैं। D
प्रोग्रामिंग भाषा के मामलों के लिए इसे इस्तेमाल करता है, जहां एक प्रारंभकर्ता है अनुपस्थित
T t = void;
- प्रारंभिक मान अनुपस्थित है(void)p
है? मुझे यह नहीं मिला कि आपके द्वारा "मूल्य का उपयोग अनुपस्थित है।"
(void) var;
बयान के बारे में उलझन है , तो मैंने stackoverflow.com/q/21045615 पर विस्तृत उत्तर पाए हैं ।
शून्य का उपयोग करने के दो तरीके हैं:
void foo(void);
या
void *bar(void*);
पहला इंगित करता है कि कोई तर्क पारित नहीं किया जा रहा है या कोई तर्क वापस नहीं किया जा रहा है।
दूसरा संकलक को बताता है कि डेटा से संबंधित कोई प्रकार प्रभावी रूप से अर्थ नहीं है कि आप किसी ज्ञात प्रकार के लिए डाले जाने तक इंगित किए गए डेटा का उपयोग नहीं कर सकते।
उदाहरण के लिए, void*
जब आप एक इंटरफ़ेस का उपयोग करते हैं, जो एक फ़ंक्शन को कॉल करता है, जिसके मापदंडों को समय से पहले नहीं जाना जा सकता है, तो आप बहुत कुछ देखेंगे ।
उदाहरण के लिए, लिनक्स कर्नेल में जब आप काम को डिफाइन कर रहे हैं, तो आप किसी फ़ंक्शन को बाद के समय में चलाने के लिए फ़ंक्शन को पॉइंटर चलाने के लिए और एक पॉइंटर को फ़ंक्शन को पारित करने के लिए देकर सेटअप करेंगे:
struct _deferred_work {
sruct list_head mylist;
.worker_func = bar;
.data = somedata;
} deferred_work;
तब एक कर्नेल थ्रेड आस्थगित काम की एक सूची से अधिक हो जाता है और जब यह इस नोड को मिल जाता है तो यह प्रभावी रूप से निष्पादित होता है:
bar(somedata);
फिर आपके पास बार में:
void bar(void* mydata) {
int *data = mydata;
/* do something with data */;
}
इसका अर्थ है "कोई मूल्य नहीं"। आप void
यह इंगित करने के लिए उपयोग करते हैं कि कोई फ़ंक्शन मान वापस नहीं करता है या इसका कोई पैरामीटर या दोनों नहीं है। अंग्रेजी में शून्य शब्द के विशिष्ट उपयोग के साथ बहुत अधिक सुसंगत ।
यह किसी फ़ंक्शन में रिटर्न मान की अनुपस्थिति को इंगित करता है।
कुछ भाषाओं में दो प्रकार की उप-प्रक्रियाएँ होती हैं: प्रक्रियाएँ और कार्य। प्रक्रियाएं केवल संचालन का एक अनुक्रम हैं, जबकि एक फ़ंक्शन संचालन का एक अनुक्रम है जो एक परिणाम देता है।
सी और उसके डेरिवेटिव में, दोनों के बीच का अंतर स्पष्ट नहीं है। सब कुछ मूल रूप से एक फ़ंक्शन है। void
कीवर्ड इंगित करता है कि यह एक "वास्तविक" समारोह नहीं है, क्योंकि यह एक मूल्य वापस नहीं करता।
शून्य को "खाली संरचना" के रूप में सोचें। मुझे समझाने दो।
प्रत्येक फ़ंक्शन मापदंडों का एक क्रम लेता है, जहां प्रत्येक पैरामीटर का एक प्रकार होता है। वास्तव में, हम मापदंडों के अनुरूप संरचना स्लॉट के साथ एक संरचना में मापदंडों को पैकेज कर सकते हैं। इससे प्रत्येक फ़ंक्शन का एक तर्क होता है। इसी तरह, फ़ंक्शन एक परिणाम का उत्पादन करते हैं, जिसमें एक प्रकार होता है। यह एक बूलियन हो सकता है, या यह फ्लोट हो सकता है, या यह एक संरचना हो सकती है, जिसमें अन्य टाइप किए गए मानों का एक मनमाना सेट होता है। यदि हम एक ऐसी छूट चाहते हैं जिसमें कई रिटर्न मान हों, तो यह आसान है कि वे केवल एक संरचना में पैक किए जाएं। वास्तव में, हम हमेशा जोर देकर कह सकते हैं कि एक फ़ंक्शन ने एक संरचना लौटा दी। अब प्रत्येक फ़ंक्शन ठीक एक तर्क लेता है, और ठीक एक मान पैदा करता है।
अब, क्या होता है जब मुझे एक फ़ंक्शन की आवश्यकता होती है जो "नहीं" मान पैदा करता है? खैर, विचार करें कि जब मुझे 3 स्लॉट्स के साथ एक संरचना बनाते हैं तो मुझे क्या मिलता है: यह 3 मान रखता है। जब मेरे पास 2 स्लॉट होते हैं, तो यह दो मान रखता है। जब इसका एक स्लॉट होता है, तो एक मूल्य। और जब यह शून्य स्लॉट होता है, तो यह ... उह, शून्य मान, या "कोई" मूल्य "नहीं होता है। इसलिए, मैं एक फ़ंक्शन को शून्य मानकर वापस लौट सकता हूं, जिसमें कोई मान नहीं है, जिसमें आप" शून्य "भी तय कर सकते हैं। भाषा में एक कीवर्ड के बजाय खाली संरचना द्वारा दर्शाए गए प्रकार का केवल एक पर्याय है (शायद इसका सिर्फ एक पूर्वनिर्धारित प्रकार :)
इसी तरह, मैं एक फ़ंक्शन के बारे में सोच सकता हूं जिसमें खाली संरचना को स्वीकार करने के लिए कोई मूल्य नहीं है, उदाहरण के लिए, "शून्य"।
मैं अपनी प्रोग्रामिंग भाषा को इस तरह भी लागू कर सकता हूं। शून्य मान को पास करना शून्य बाइट्स लेता है, इसलिए शून्य मान को पार करना मनमाने आकार के अन्य मूल्यों को पारित करने का एक विशेष मामला है। यह संकलक के लिए "शून्य" परिणाम या तर्क का इलाज करना आसान बनाता है। आप शायद एक लैंग्वेज सुविधा चाहते हैं जो एक फ़ंक्शन परिणाम को फेंक सकता है; सी में, यदि आप निम्न कथन में गैर-शून्य परिणाम फ़ंक्शन फू कहते हैं: फू (...); संकलक जानता है कि फू एक परिणाम पैदा करता है और बस इसे अनदेखा करता है। यदि शून्य एक मान है, तो यह पूरी तरह से काम करता है और अब "प्रक्रियाएं" (जो शून्य परिणाम वाले फ़ंक्शन के लिए एक विशेषण हैं) सामान्य कार्यों के केवल तुच्छ विशेष मामले हैं।
शून्य * थोड़ा मजेदार है। मुझे नहीं लगता कि सी डिजाइनरों ने उपरोक्त तरीके से शून्य के बारे में सोचा; उन्होंने सिर्फ एक कीवर्ड बनाया। वह कीवर्ड तब उपलब्ध था जब किसी को एक मनमाने प्रकार के बिंदु की आवश्यकता थी, इस प्रकार शून्य में * शून्य के रूप में। यह वास्तव में बहुत अच्छी तरह से काम करता है यदि आप रिक्त संरचना के रूप में शून्य की व्याख्या करते हैं। एक शून्य * पॉइंटर एक ऐसी जगह का पता है जहां उस खाली संरचना को रखा गया है।
अन्य प्रकार के टी के लिए शून्य * से टी * तक कास्ट, इस दृष्टिकोण के साथ भी काम करते हैं। पॉइंटर कास्ट एक पूर्ण धोखा है जो इस तथ्य का लाभ उठाने के लिए सबसे आम आर्किटेक्चर पर काम करता है कि यदि एक यौगिक प्रकार टी में उप-प्रकार एस के साथ एक तत्व है जो भौतिक रूप से टी की शुरुआत में इसके स्टोरेज लेआउट में रखा गया है, तो एस * से टी * तक कास्टिंग करें। एक ही भौतिक मशीन पते का उपयोग करने के विपरीत इसके विपरीत काम करना बंद हो जाता है, क्योंकि अधिकांश मशीन पॉइंटर्स में एक ही प्रतिनिधित्व होता है। प्रकार S द्वारा प्रकार V को प्रतिस्थापित करने से ठीक वैसा ही प्रभाव प्राप्त होता है, और इस प्रकार शून्य से / के लिए कास्टिंग कार्य करता है।
PARLANSE प्रोग्रामिंग भाषा उपरोक्त विचारों को बहुत बारीकी से लागू करती है। हमने इसके डिजाइन में नासमझी की, और वापसी प्रकार के रूप में "शून्य" पर पूरा ध्यान नहीं दिया और इस प्रकार प्रक्रिया के लिए लैंग्वेज कीवर्ड हैं। इसका ज्यादातर सिर्फ एक सरल वाक्यविन्यास है, लेकिन इसकी एक चीज़ जो आपको एक भाषा में एक बड़ा बॉडी वर्किंग कोड मिलने के बाद नहीं मिलती है।
C # में आप यह बताने के लिए शून्य कीवर्ड का उपयोग करेंगे कि कोई विधि मान नहीं लौटाती है:
public void DoSomeWork()
{
//some work
}
शून्य के लिए तीन उपयोग के मामले:
समारोह हस्ताक्षर। void foo(int bar)
मान वापस नहीं करता है। int bar(void)
कोई पैरामीटर नहीं लेता है, लेकिन यह आमतौर पर खाली तर्क सूची के साथ व्यक्त किया जाता है int bar()
:। यहां शून्य कीवर्ड का उपयोग अंग्रेजी में इसके अर्थ से मेल खाता है।
जेनेरिक टॉप-टाइप पॉइंटर void *
जो अनिर्दिष्ट डेटा की ओर इशारा करता है और इसे डीरिफाइर नहीं किया जा सकता है। यहाँ शून्य का अर्थ शून्य के अन्य अर्थों से अलग है: सार्वभौमिक प्रकार बनाम कोई प्रकार नहीं।
इस तरह (void) new Foo(this)
के संकेत देने के लिए कि रिटर्न वैल्यू जानबूझकर फेंक दी जाती है। यहां कीवर्ड का उपयोग अंग्रेजी में इसके अर्थ से भी मेल खाता है।
मामले 1 और 2 को पहले ही @ गेराल्ड द्वारा कवर किया गया था लेकिन केस 3 को अभी तक संबोधित नहीं किया गया है।
यदि आप एक शुरुआत के लिए अवधारणा की व्याख्या कर रहे हैं, तो यह एक सादृश्य का उपयोग करने के लिए सहायक हो सकता है। इन सभी मामलों में शून्य का उपयोग एक पुस्तक के पृष्ठ के अर्थ के अनुरूप है, जिसमें निम्नलिखित शब्द हैं, "यह पृष्ठ जानबूझकर खाली छोड़ दिया गया है।" यह कुछ के बीच संकलक में अंतर करना है जिसे एक त्रुटि के रूप में चिह्नित किया जाना चाहिए, बनाम एक प्रकार जो जानबूझकर खाली छोड़ दिया जाना चाहिए क्योंकि यह वह व्यवहार है जो आप चाहते हैं।
यह हमेशा कोड में दिखाई देता है जहां आम तौर पर आपको एक प्रकार दिखाई देने की उम्मीद होती है, जैसे कि रिटर्न प्रकार या पॉइंटर प्रकार। यही कारण है कि C # में, एक वास्तविक CLR प्रकार, System.Void के लिए नक्शे को शून्य करता है क्योंकि यह अपने आप में एक प्रकार है।
कुछ प्रोग्रामिंग भाषाओं ने शून्य की अवधारणा को कभी विकसित नहीं किया, जैसे कुछ मानव संस्कृतियों ने कभी भी शून्य की अवधारणा का आविष्कार नहीं किया। शून्य प्रोग्रामिंग भाषा में उसी उन्नति का प्रतिनिधित्व करता है जैसा कि शून्य की अवधारणा मानव भाषा का प्रतिनिधित्व करती है।
इसका अर्थ है "कोई मूल्य नहीं"। आप शून्य का उपयोग यह इंगित करने के लिए करते हैं कि कोई फ़ंक्शन मान नहीं लौटाता है या इसका कोई पैरामीटर नहीं है या दोनों हैं। अंग्रेजी में शब्द शून्य के विशिष्ट उपयोगों के साथ यह बहुत संगत है।
शून्य को शून्य से भ्रमित नहीं होना चाहिए। अशक्त का अर्थ उस चर के लिए है जिसका पता स्टैक पर है, उस पते के लिए ढेर पर मान रिक्त है।
शून्य का उपयोग केवल विधि हस्ताक्षरों में किया जाता है। रिटर्न प्रकारों के लिए इसका मतलब है कि कॉलिंग कोड में विधि कुछ भी वापस नहीं करेगी। मापदंडों के लिए इसका मतलब है, विधि के लिए कोई पैरामीटर पारित नहीं किया जाता है
जैसे
void MethodThatReturnsAndTakesVoid(void)
{
// Method body
}
C # में हम पैरामीटर के लिए शून्य को छोड़ सकते हैं और उपरोक्त कोड को इस प्रकार लिख सकते हैं:
void MethodThatReturnsAndTakesVoid()
{
// Method body
}
शून्य को शून्य से भ्रमित नहीं होना चाहिए। अशक्त का अर्थ उस चर के लिए है जिसका पता स्टैक पर है, उस पते के लिए ढेर पर मान रिक्त है।
शून्य का मतलब है कि आप फ़ंक्शन या विधि के किसी भी मूल्य को वापस नहीं करेंगे
शून्य का मतलब तीनों भाषाओं में एक फ़ंक्शन से रिटर्न प्रकार में आवश्यक कोई मूल्य नहीं है।