2010-02-12 13 views
27

मुझे रिकर्सन के पिछले स्तर पर वापस जाना होगा। नीचे सिंटैक्स सही है?क्या मैं शून्य कार्य में वापस आ सकता हूं?

void f() 
{ 
    // some code here 
    // 
    return; 
} 
+23

क्या आपने संकलन करने की कोशिश की है? –

+14

@ मिच: जैसा कि उचित है, यह केवल साबित करता है कि _your_ कंपाइलर इसका समर्थन करता है, भले ही यह वास्तव में वैध C++ मान्य न हो। जैसे मैं आसानी से "सिद्ध" कर सकता हूं कि 'शून्य मुख्य() 'इस तरह सही है। – MSalters

उत्तर

57

हां, आप एक शून्य कार्य से वापस आ सकते हैं।

दिलचस्प बात यह है कि आप एक शून्य कार्य से शून्य भी वापस कर सकते हैं। उदाहरण के लिए:

void foo() 
{ 
    return void(); 
} 

जैसी उम्मीद थी, इस एक सादे return; के समान है। यह गूढ़ लग सकता है, लेकिन कारण टेम्पलेट स्थिरता के लिए है:

template<class T> 
T default_value() 
{ 
    return T(); 
} 

यहाँ, default_value प्रकार टी की एक डिफ़ॉल्ट-निर्मित वस्तु देता है, और क्योंकि void वापसी करने की क्षमता है, तो यह और भी जब T = void काम करता है।

+0

क्या यह वही बात है यदि रिटर्न निर्देश में, आप एक फ़ंक्शन को कॉल करते हैं, जो एक शून्य देता है? जैसे वापसी एफ(); जहां एफ का प्रोटोटाइप शून्य एफ() है; – Goaler444

+0

ओह प्रतीक्षा करें, तो इस निर्माता के पास शून्य (शून्य) हस्ताक्षर है? तो 'वापसी शून्य (शून्य()) 'मान्य भी है। कोड obfuscation किसी को भी प्रतियोगिता? –

10

निश्चित रूप से। आपको बस एक वास्तविक मूल्य वापस नहीं करना चाहिए।

3

हां, आप फ़ंक्शन से वापस आने के लिए उस कोड का उपयोग कर सकते हैं। (मुझे स्टैक ओवरफ्लो बनाने के लिए यहां बहुत वर्बोज़ होना है कि मेरा जवाब बहुत छोटा नहीं है)

+0

नहीं, यह केवल 15 वर्ण हैं। मेरा विश्वास करो, मैं इसमें * सभी * समय चलाता हूं ... –

+1

आईआईआरसी आप रिक्त स्थान के साथ पैड करने में सक्षम होते थे :-) – xyz

+0

आप कुछ पात्रों को पैड करने के लिए इलिप्स का उपयोग कर सकते हैं, और '(15) 'आपको देता है यह और भी स्पष्ट करते हुए कि आप इसे पैडिंग के लिए कर रहे हैं। –

2

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

+0

हां, आप सही हैं। हालांकि यह जानने के बिना कि यहां कुछ कोड का संदर्भ क्या है, इसका जिक्र स्पष्ट हो सकता है।हालांकि बंद ब्रेस से पहले वापसी अपरिपक्व है। – Casey

4

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

आप डीबगर का उपयोग करके इसे भी सत्यापित कर सकते हैं। बस अपने कोड में कुछ ब्रेक पॉइंट डालें और इसके माध्यम से कदम उठाएं। आप स्वयं को सत्यापित कर सकते हैं कि यह काम करता है।

+1

ढेर फ्रेम। नए धागे को नए ढेर मिलते हैं, फ़ंक्शन कॉल को दिए गए थ्रेड में एक ही स्टैक पर नए स्टैक फ्रेम मिलते हैं। बस उस विवरण को साफ़ करना चाहते हैं क्योंकि यह नवागंतुकों को भ्रमित कर सकता है। – stu

2

इसका सरल जवाब हाँ है! सी ++ बिना किसी वापसी के फ़ंक्शन के रूप में शून्य विधि को पहचानता है। यह मूल रूप से संकलक को बताता है कि जो भी होता है, एक बार जब आप return; तोड़ते हैं और विधि छोड़ते हैं ....

2

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

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

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