2012-07-19 22 views
12

void f() का अर्थ है कि f कुछ भी नहीं देता है। यदि void कुछ भी नहीं देता है, तो हम इसका उपयोग क्यों करते हैं? void का मुख्य उद्देश्य क्या है?यदि शून्य() कोई मान वापस नहीं करता है, तो हम इसका उपयोग क्यों करते हैं?

+3

कुछ भी वापस करने के लिए, obv। एक फ़ंक्शन जिसमें केवल दुष्प्रभाव होते हैं और गणना किए गए मान को वापस नहीं करते हैं, वह पूरी तरह वैध है। –

उत्तर

29

जब सी का आविष्कार किया गया था तो सम्मेलन यह था कि, यदि आपने रिटर्न प्रकार निर्दिष्ट नहीं किया है, तो संकलक स्वचालित रूप से अनुमान लगाता है कि आप int (और पैरामीटर के लिए समान हैं) वापस करना चाहते हैं।

लेकिन अक्सर आप ऐसे काम लिखते हैं जो सामान करते हैं और कुछ भी वापस करने की आवश्यकता नहीं होती है (सोचें कि एक फ़ंक्शन के बारे में जो सिर्फ स्क्रीन पर कुछ प्रिंट करता है); इस कारण से, यह निर्णय लिया गया था कि, यह निर्दिष्ट करने के लिए कि आप कुछ भी वापस नहीं करना चाहते हैं, आपको void कीवर्ड को "रिटर्न टाइप" के रूप में उपयोग करना होगा।


ध्यान रखें कि void भी अन्य प्रयोजनों के कार्य करता है; विशेष रूप से:

  • यदि आप एक कार्यों के लिए मानकों की सूची के रूप में यह निर्दिष्ट करते हैं, इसका मतलब है कि समारोह कोई पैरामीटर लेता है; सी में इसकी आवश्यकता थी, क्योंकि पैरामीटर के बिना एक फ़ंक्शन घोषणा संकलक के लिए थी कि पैरामीटर सूची को बस निर्दिष्ट नहीं किया गया था। सी ++ में इसकी अब आवश्यकता नहीं है, क्योंकि खाली पैरामीटर सूची का अर्थ है कि फ़ंक्शन के लिए कोई पैरामीटर अनुमति नहीं है;

  • void पॉइंटर्स में भी एक महत्वपूर्ण भूमिका है; void * (और इसकी विविधताएं) का अर्थ है "कुछ निर्दिष्ट करने के लिए पॉइंटर निर्दिष्ट नहीं है"। यह उपयोगी है अगर आपको उन कार्यों को लिखना है जो वास्तव में उनका उपयोग किए बिना पॉइंटर्स को स्टोर/पास करना चाहिए (केवल अंत में, पॉइंटर का उपयोग करने के लिए, उपयुक्त प्रकार के लिए एक कास्ट आवश्यक है)।

  • भी, (void) पर एक कास्ट अक्सर जानबूझकर अप्रयुक्त, संकलक चेतावनियों को दबाकर मान को चिह्नित करने के लिए उपयोग किया जाता है।

    int somefunction(int a, int b, int c) 
    { 
        (void)c; // c is reserved for future usage, kill the "unused parameter" warning 
        return a+b; 
    } 
    
+0

वास्तव में क्या "(शून्य) सी" कर रहा है? – innochenti

+2

स्पष्ट रूप से दाईं ओर अभिव्यक्ति के मूल्य को त्याग देता है। यह वैसे भी करेगा यदि आपने '(शून्य)' नहीं लिखा है, लेकिन यह स्पष्ट करता है (पाठक और संकलक को) कि आप * वास्तव में * वापसी मूल्य की परवाह नहीं करते हैं; इसका उपयोग उन मामलों में कुछ चेतावनियों (अप्रयुक्त लौटा मूल्य, अप्रयुक्त पैरामीटर) को बंद करने के लिए किया जाता है जहां आप स्पष्ट रूप से उन मानों की परवाह नहीं करते हैं। दोबारा, इसका उत्पन्न कोड पर कोई विशेष प्रभाव नहीं पड़ता है, लेकिन यह एक मुहावरे है जो किसी विशेष अर्थ को व्यक्त करता है। –

+0

@innochenti: उदाहरण देखें [यहां] (http://stackoverflow.com/a/4178714/214671) –

0

शायद संकलक को बताने के लिए "आपको सभी सीपीयू-रजिस्टरों को धक्का और पॉप करने की आवश्यकता नहीं है!"

+1

हू ?! बुलाया गया फ़ंक्शन अभी भी उन रजिस्टरों को मिटा देगा, भले ही यह कोई मान न लौटाए। – Ant

2

क्योंकि कभी-कभी आपको वापसी मूल्य की आवश्यकता नहीं होती है। यही कारण है कि हम इसका इस्तेमाल करते हैं।

1

आप void आपके पास नहीं था, तुम कैसे संकलक है कि एक समारोह एक मूल्य वापस नहीं करता है बताएंगे?

+0

कुछ भी निर्दिष्ट नहीं करने के बारे में कैसे? जैसे। 'शून्य fooFunction() {} 'के बजाय बस सादा' fooFunction() {}'? –

+1

@ एमिट टॉमर सी ++ में आप _must_ रिटर्न प्रकार निर्दिष्ट करते हैं। सी में कोई वापसी प्रकार 'int' का तात्पर्य नहीं है। –

+0

मेरा मतलब था, सी ++ में ऐसा क्यों नहीं हो सकता था, यह कंपाइलर को बताने के लिए कि कोई फ़ंक्शन कोई मान नहीं देता है, वापसी प्रकार को खाली के रूप में छोड़ दें। विशेष प्रकार निर्दिष्ट करने के लिए, प्रकार लिखें। लिखने के लिए एक विशेष आवश्यकता क्यों शून्य?क्या यह एक डिजाइन निर्णय से अधिक है? –

5

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

+4

असल में 'printf' मुद्रित वर्णों की संख्या के बराबर' int' मान देता है। –

+0

@ पॉलर व्हाउप्स, आप सही हैं। क्या मेरा चेहरा लाल है ... – waldrumpus

+0

@PaulR वैसे, मैं स्ट्राइकथ्रू टेक्स्ट कैसे करूं? मैं printf उदाहरण के माध्यम से हमला करना चाहता था ताकि आपकी टिप्पणी को अमान्य न किया जाए, लेकिन मैं इसे समझ नहीं पाया। – waldrumpus

5

शून्य() का अर्थ कुछ भी नहीं है।

voidकुछ भी नहीं मतलब यह नहीं है। void एक प्रकार से कुछ भी प्रस्तुत नहीं करता है।यह एक सूक्ष्म अंतर है: प्रतिनिधित्व अभी भी आवश्यक है, भले ही यह कुछ भी प्रस्तुत न करे।

यह प्रकार समारोह के वापसी प्रकार जो कुछ भी नहीं देता है के रूप में प्रयोग किया जाता है। इसका उपयोग जेनेरिक डेटा का प्रतिनिधित्व करने के लिए भी किया जाता है, जब इसे void* के रूप में उपयोग किया जाता है। तो यह मनोरंजक लगता है कि voidका प्रतिनिधित्व करता है, void*सब कुछ का प्रतिनिधित्व करता है!

0

कभी-कभी इसे वापस करने के बजाए कुछ प्रिंट करने के लिए इसका उपयोग किया जा सकता है। (के रूप में यह पता चला है, यह एक भयानक विचार था) सी ++ सी से उधार लिया, और सी परोक्ष सब कुछ int के रूप में untyped टाइप करने के लिए प्रयोग किया है: उदाहरण

+1

क्या आप थोड़ा सा समझाते हैं? – Shahbaz

5

यह सवाल भाषा के इतिहास के साथ क्या करना है के लिए http://en.wikipedia.org/wiki/Mutator_method#C_example देखें। इसमें कार्य शामिल थे जो प्रक्रियाओं के रूप में लक्षित थे (याद रखें कि कार्यों और प्रक्रियाओं के बीच का अंतर यह है कि फ़ंक्शन इनवोकेशन अभिव्यक्तियां हैं, जबकि प्रक्रिया आमंत्रण विवरण हैं)। अगर मैं इसे जल्दी सी किताबें पढ़ने से सही ढंग से याद करते हैं, प्रोग्रामर एक #define साथ इस कमी को पैच करने के लिए प्रयोग किया है:

#define void int 

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

+1

+1 क्योंकि मैंने पुराने कोड में यह 'परिभाषित' कथन देखा था, एक बेतुका लेबल के साथ 'ifdef' द्वारा अवरुद्ध किया गया था, और यह पता नहीं लगा कि किसी ने इसे क्यों लिखा था। –

1

कारण कुछ स्थितियों पर विचार करें जहां आपको वैश्विक चर पर कुछ गणना करना पड़ सकता है और परिणाम वैश्विक वैरिएबल में डाल सकते हैं या आप तर्कों के आधार पर कुछ प्रिंट करना चाहते हैं .. इन परिस्थितियों में आप उस विधि का उपयोग कर सकते हैं जो मूल्य वापस नहीं कर सकता । .. यानी शून्य

1

यहाँ एक उदाहरण समारोह है:

struct SVeryBigStruct 
{ 
    // a lot of data here 
}; 

SVeryBigStruct foo() 
{ 
    SVeryBigStruct bar; 
    // calculate something here 

    return bar; 
} 

और अब यहाँ एक और समारोह है:

void foo2(SVeryBigStruct& bar) // or SVeryBigStruct* pBar 
{ 
    bar.member1 = ... 
    bar.member2 = ... 
} 

दूसरा कार्य तेज है, इसे पूरी संरचना की प्रतिलिपि बनाने की आवश्यकता नहीं है।

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

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