2012-07-05 14 views
6

संभव डुप्लिकेट पर रिकर्सिव कॉल:
Can main function call itself in C++?मुख्य सी ++

मैं इस समस्या को बहुत ही दिलचस्प पाया लेकिन थोड़ा बाजीगर। प्रश्न 6.42 सी ++ डायटल द्वारा प्रोग्राम कैसे करें "क्या मुख्य रूप से आपके सिस्टम पर मुख्य रूप से कॉल किया जा सकता है? एक प्रोग्राम मुख्य रूप से एक प्रोग्राम लिखें। स्टेटिक स्थानीय वैरिएबल गिनती शामिल करें और 1 में प्रारंभ करें। पोस्ट-वृद्धि और प्रत्येक बार मुख्य रूप से गिनती के मूल्य को मुद्रित करें कहा जाता है। अपने कार्यक्रम संकलित करें। क्या?

मैं नीचे के रूप में कार्यक्रम में लिखा था, लेकिन इसके बजाय मैं प्रत्यावर्तन बंद हो जाता है के रूप में अगर मैं इसे चल कहीं भी होगी रखने के लिए थे 10 बार के बाद बंद हो जाता है 41000.

चारों ओर एक मूल्य पर किया होता मेरा प्रश्न: सी ++ में रिकर्सिवली मुख्य फ़ंक्शन को कॉल करना कानूनी कैसे है, क्या इस प्रोग्राम को प्रवाह या मेमोरी गलती आदि पर ढेर करने के लिए निष्पादित किया जाना चाहिए .. कृपया बताएं।

#include <iostream> 
using namespace std; 
int main() 
{ 
     static int count = 0; 
     count++; 
     if(count <= 10) { 
       cout << count << endl; 
       return main(); //call main 
       }//end if 

     system("pause"); 
     return 0;//successful completion 
}//end main 

आप

उत्तर

17

धन्यवाद कैसे यह कानूनी C++ में रिकर्सिवली main() समारोह कॉल करने के लिए

यह कानूनी नहीं है। सी ++ भाषा मानक बताता है कि "फ़ंक्शन मुख्य का उपयोग किसी प्रोग्राम के भीतर नहीं किया जाएगा" (सी ++ 11 §3.6.1/3)। फ़ंक्शन को कॉल करना "उपयोग" का एक रूप है।

main() पर कॉल करने वाले किसी भी प्रोग्राम को अनिर्धारित व्यवहार प्रदर्शित करता है (तकनीकी रूप से, इस तरह का एक कार्यक्रम खराब हो गया है क्योंकि नियम का उल्लंघन किया जा रहा है एक निदान अर्थपूर्ण नियम है, हालांकि मुझे आश्चर्य होगा कि अधिकांश कंपेलरों ने कार्यक्रम को खारिज कर दिया है)। ध्यान दें कि यह रनटाइम इंफ्रास्ट्रक्चर को रोकता नहीं है जो आपके प्रोग्राम को main() फ़ंक्शन को कॉल करने से शुरू करता है।

+3

मुझे लगता है कि यह अधिक मानव-पठनीय उद्धृत करने में भी मदद करता है, लेकिन कम सामान्य "§5.2.2 [expr.call]/9 – Cubbi

+0

@ जेम्स से" मुख्य नाम के फ़ंक्शन को छोड़कर रिकर्सिव कॉल की अनुमति है, धन्यवाद आपके उत्तर के लिए - यदि सी ++ मानक उपर्युक्त कहता है - तो कंपेलरों द्वारा रिकर्सिव कॉल की अनुमति क्यों दी जाती है। मुझे समझने के लिए अजीब व्यवहार मिला। मैं आपके उत्तर की सराहना करता हूं। – Sinan

+1

मैं सभी कंपाइलरों के लिए इसका उत्तर नहीं दे सकता, क्योंकि मैं केवल एक (विज़ुअल सी ++) से परिचित हूं और कुछ अन्य लोगों से कुछ परिचित हूं। हालांकि, मुझे लगता है कि 'मुख्य() 'का संकलन किसी अन्य कार्य की तरह संकलक द्वारा किया जाता है। विंडोज़ पर, 'मुख्य() 'ओएस द्वारा दर्ज एंट्री पॉइंट नहीं है: यह नहीं हो सकता है, क्योंकि सी रनटाइम को ग्लोबल्स को शुरू करने और निष्पादन के लिए पर्यावरण तैयार करने के लिए काम करना पड़ता है। ऐसा करने के बाद, सी रनटाइम आपके प्रोग्राम के 'मुख्य() 'को कॉल करता है। तो, यह वास्तव में सिर्फ एक और कार्य है, लेकिन _you_ को इसे कॉल करने की अनुमति नहीं है, केवल सी रनटाइम इसे कॉल कर सकता है। –

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