क्यों `main` int या शून्य के बजाय एक डबल या स्ट्रिंग वापस नहीं कर सकते?


38

कई भाषाओं में जैसे C, C ++, और Java, mainमेथड / फंक्शन का रिटर्न प्रकार है voidया int, लेकिन नहीं doubleया String। उसके पीछे क्या कारण हो सकते हैं?

मैं थोड़ा-बहुत जानता हूं कि हम ऐसा नहीं कर सकते क्योंकि mainरनटाइम लाइब्रेरी द्वारा कहा जाता है और यह कुछ सिंटैक्स की उम्मीद करता है जैसे कि हमें int main()उससे int main(int,char**)चिपकना होगा।

तो मेरा सवाल यह है: कि mainजिस प्रकार के हस्ताक्षर हैं, वह अलग क्यों नहीं है?


15
दोहरे रिटर्न मूल्य का क्या अर्थ होगा ? एक स्ट्रिंग वापसी मूल्य का क्या अर्थ होगा ?

1
ki समझते हैं कि इसका कोई मतलब नहीं है। लेकिन किसी भी अन्य कारणों और सम्मेलनों के लिए?
जावा

1
मुझे लगता है कि इसका कोई मतलब नहीं है, केवल इसलिए कि सार्वभौमिक रूप से यह चुना गया था कि सामान्य निकास के लिए 0 और एक असामान्य के लिए एक गैर शून्य है। इंट को व्यापक क्रॉस भाषा संगतता के साथ सबसे सरल डेटा प्रकार के रूप में चुना गया था। @ डेलान
जावा

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

3
@sunny "ब्रॉड क्रॉस भाषा अनुकूलता" एक मुद्दा नहीं था। C और UNIX को अग्रानुक्रम में लिखा गया था। कई अन्य भाषाएं ints को लौटाती हैं, क्योंकि वे UNIX या UNIX जैसे वातावरण में काम करने के लिए डिज़ाइन की गई थीं।

जवाबों:


83

का रिटर्न मान mainऑपरेटिंग सिस्टम ( किसी भी ऑपरेटिंग सिस्टम) को एकल, सुसंगत तरीके से पारित किया जाना है । ऑपरेटिंग सिस्टम को जानने के लिए आवश्यक जानकारी "क्या कार्यक्रम सफलतापूर्वक समाप्त हो गया था, या कोई त्रुटि थी?"

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

ओएस (और शेल) पर वापस डेटा संचार के लिए पूर्णांक पर कोई अतिरिक्त मान नहीं है। अधिकांश भाग के लिए, कंप्यूटर के इन भागों में से कोई भी फ़्लोटिंग पॉइंट नंबरों के साथ सौदा नहीं करता है। युगल भी तुलना करने में मुश्किल नहीं हैं। गणना करने योग्य नहीं होने पर, वे रिपोर्ट करते हैं कि त्रुटि क्या थी (यह मानकर कि आपने सफलता के लिए एक विशेष मूल्य चुना है)। फिर से, फ़्लोटिंग पॉइंट संगत नहीं हैं - 8 बिट मशीन पर एक फ्लोट 16 बिट पर फ्लोट से अलग था और 32 बिट मशीन (और वे सिर्फ 'सामान्य' वाले हैं - आईबीएम के भीतर भी, फ़्लोटिंग पॉइंट मानकीकृत नहीं था 1980 के दशक तक एक ही निर्माता द्वारा मशीनों के बीच। और फिर आपको दशमलव बनाम बाइनरी कंप्यूटर मिला है। फ़्लोटिंग पॉइंट मान संगत नहीं हैं और सार्थक डेटा वापस नहीं देते हैं।

यह वास्तव में हमें विकल्प के रूप में बाइट और पूर्णांक के साथ छोड़ देता है। जो कन्वेंशन स्थापित किया गया था वह '0' था, और कुछ भी त्रुटि थी। एक पूर्णांक त्रुटि को रिपोर्ट करने के लिए बाइट से अधिक जगह देता है। इसे एनुमरेट किया जा सकता है (1 का मतलब XYZ, 2 का रिटर्न ABC, 3 का रिटर्न, DEF, आदि ..) या झंडे के रूप में उपयोग किया जाता है ( 0x0001इसका 0x0002मतलब है कि यह विफल हुआ, इसका मतलब है कि असफल, 0x0003इसका मतलब है कि यह और वह दोनों विफल)। इसे केवल एक बाइट तक सीमित करने से झंडे आसानी से निकल सकते हैं (केवल 8), इसलिए निर्णय शायद पूर्णांक का उपयोग करना था।


2
मैं मुख्य C / C ++ क्रम पुस्तकालय द्वारा कहा जाता है से पहले ओएस इसे कहते लगता है जो भी ओएस @ MichaelT द्वारा कोड हमारे कोड के साथ भरी हुई है और कहा जाता है का एक टुकड़ा है
जावा

5
main()अलग-अलग ऑपरेटिंग सिस्टम पर अलग-अलग तरीके से लागू किया जाता है। सी में, मुख्य () विधि को शुरू में कैसे कहा जाता है? इसमें जाता है।

22
मुझे लगता है कि समझने के लिए महत्वपूर्ण बिंदु यह है कि main- किसी भी कार्यक्रम में अन्य कार्यों के विपरीत - प्रोग्रामर द्वारा परिभाषित प्रोटोकॉल का हिस्सा नहीं है, लेकिन प्रोटोकॉल मेजबान (ओएस) के साथ इंटरफेस करने के लिए उपयोग किया जाता है। आप इसे लेने के लिए नहीं है क्योंकि यह तुम्हारा लेने के लिए कभी नहीं था। एक अधिक व्यावहारिक स्तर पर, UNIX एक प्रक्रिया द्वारा वापस लौटने का इरादा रखता है, और इसलिए सी-टू-यूनिक्स प्रोटोकॉल बिल्कुल ऐसा ही करता है। तर्क-पास के लिए एक समसामयिक तर्क दिया जा सकता है: यदि सी का आविष्कार एक OS / होस्ट के लिए किया गया था जो केवल संख्याओं को तर्क के रूप में पारित करता था (उदाहरण के लिए कोई कमांड-लाइन नहीं), तो तर्क तार के बजाय अंतःक्षिप्त होंगे।
यूरो माइकेल

2
IBM ने EBCDIC से कोड पेजों की अवधारणा को अपने PC में ले लिया। वे आज भी हमें परेशान करते हैं, आईबीएम 5150 की शुरूआत के 35 साल बाद। 7-बिट एएससीआईआई कोडपेज-कम है, लेकिन 8-बिट कैरेक्टर कोड एक ही कंप्यूटर पर भी कई अलग-अलग तरीकों से व्याख्या किए जा सकते हैं, सेटिंग्स पर निर्भर करता है - - मल्टी-बाइट एन्कोडिंग के लिए उस कोड को अकेले कोड करें। तो यह वास्तव में इससे भी बदतर है कि आप दूसरे पैराग्राफ के अंतिम वाक्य में क्या कहते हैं।
बजे एक CVn

@EuroMicelli यह एक बहुत अच्छी जानकारी है जो वास्तव में इसके लिए धन्यवाद :)
JAVA

27

खैर, यह कर सकता है

उदाहरण के लिए, योजना 9 में प्रयुक्त सी की बोली में ऑपरेटिंग सिस्टम mainको आमतौर पर एक voidफ़ंक्शन के रूप में घोषित किया जाता है , लेकिन फ़ंक्शन को स्ट्रिंग पॉइंटर पास करके कॉलिंग वातावरण में निकास स्थिति वापस आ जाती है exits()। खाली स्ट्रिंग सफलता को दर्शाता है, और कोई भी खाली-खाली स्ट्रिंग किसी प्रकार की विफलता को दर्शाता है। यह एक परिणाम लौटने के द्वारा लागू किया जा सकता था ।mainchar*

और निश्चित रूप से एक floatया doubleबाहर निकलने की स्थिति के साथ एक प्रणाली को लागू करना संभव होगा ।

तो क्यों int? यह सिर्फ एक सम्मेलन की बात है - और ऑपरेटिंग सिस्टम और उनके तहत चलने वाले कार्यक्रमों में एक आम सम्मेलन का पालन करने का एक बहुत बड़ा मूल्य है।

यूनिक्स कन्वेंशन एक पूर्णांक स्थिति कोड का उपयोग करने के लिए है, जिसमें 0 को सफलता और नॉन-जीरो डिनोटिंग विफलता को दर्शाया जाता है (क्योंकि आमतौर पर सफल होने का केवल एक ही तरीका है, लेकिन असफल होने के कई तरीके)। मुझे नहीं पता कि यह सम्मेलन यूनिक्स के साथ उत्पन्न हुआ था या नहीं; मुझे संदेह है कि यह पहले के ऑपरेटिंग सिस्टम से आया था।

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

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

(संयोग से, C ++ mainकर सकते हैं केवल वापसी int, और सी में void mainही अगर संकलक विशेष रूप से इसका समर्थन करता है की अनुमति है। कई compilers बहुत जोर से यदि आप लिखना शिकायत नहीं है void main, लेकिन यह कहना केवल एक मामूली अतिशयोक्ति नहीं है कि यह गलत ।)


9

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


3
एक स्ट्रिंग को कचरा इकट्ठा करने की आवश्यकता क्यों होती है जबकि एक पूर्णांक नहीं होता है?
ब्रैड

4
@ ब्रैड, स्ट्रिंग्स उनकी चर लंबाई है और सार में एक सरणी को वापस पारित करने के समान होगा जो एक वर्ण हो सकता है या यह हजारों हो सकता है। डायनामिक मेमोरी एक दर्द होगा जबकि एक इंट एक निश्चित आकार है जिसे संभालना इतना कठिन नहीं है।
जेबी किंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.