2010-07-01 8 views
8

आमतौर पर स्वत: जनरेट C++ "मुख्य" समारोह अंत"वापसी (0) में 0 के आसपास ब्रैकेट;" 'मुख्य' समारोह में बयान - वे क्या हैं?

return (0); 

या

return (EXIT_SUCCESS); 

पर है लेकिन ऊपर बयान में कोष्ठकों देखते हैं? क्या यह सी भाषा या कुछ से संबंधित है?

// संपादित

मैं जानता हूँ कि यह सही है, लेकिन किसी एक कारण के लिए इन कोष्ठक डाल दिया। क्या कारण है?!

+0

कौन सा टूल इस कोड को उत्पन्न करता है? 'मुख्य' से लौटना बिल्कुल जरूरी नहीं है। – Philipp

+0

नेटबीन, कोड :: ब्लॉक, ग्रहण ... – adf88

+0

हाँ, आप सही हैं, EXIT_SUCCESS, सही किया गया। – adf88

उत्तर

10

उन्हें आवश्यक नहीं है (यहां तक ​​कि सी में भी)। मुझे लगता है कि कुछ लोग उन्हें 'रिटर्न' बनाने के लिए एक फंक्शन कॉल की तरह दिखते हैं, सोचते हैं कि यह अधिक सुसंगत है।

संपादित करें: ऐसा लगता है कि जेनरेटर इसे अपने स्वयं के कारणों से करता है। इस तरह से काम करने के लिए यह सुरक्षित या आसान हो सकता है।

+0

लेकिन पॉइंट क्या है यदि यह जेनरेट कोड में है? मैंने किसी तरह की सुरक्षा के बारे में सोचा। – slaphappy

+3

शायद जेनरेट कोड में अर्धविराम हो सकता है।फिर संश्लेषित संस्करण एक कंपाइलर त्रुटि का कारण बनता है, जबकि गैर-संश्लेषित संस्करण चुपचाप विफल हो जाएगा या केवल एक चेतावनी उत्पन्न करेगा। – Philipp

+0

मुझे लगता है कि कुछ ऐसी चीजें हैं जिन्हें मुझे विशेष कोड जेनरेटर के बारे में पसंद नहीं है, जिसका आप शायद उल्लेख कर रहे हैं ... उदा। अगली पंक्ति पर घुंघराले ब्रेसिज़ खोलना। # परिभाषाओं में, अभिव्यक्तियों के आस-पास ब्रैकेट डालना हमेशा अच्छा होता है, उदा। '# परिभाषित एक्स (एक्स) (x-2x) 'क्योंकि यह आमतौर पर मदद करता है जब आप' 3 * एक्स (2) 'करते हैं। मैं रिटर्न के लिए ऐसा करने के किसी भी अच्छे कारण के बारे में नहीं सोच सकता। – sje397

5

चूंकि किसी वैध अभिव्यक्ति को वापस करने के लिए पारित किया जा सकता है, वांछित होने पर उन ब्रैकेट को जोड़ा जा सकता है। यह ऐसा करने की तरह है:

int i = (0); 

आप घोंसला आप के रूप में कई कोष्ठक में एक अभिव्यक्ति की तरह कर सकते हैं:

return (((((0))))); 
+6

आप यह भी कर सकते हैं: वापसी (42 - 42); – nas

2

उन आवश्यकता नहीं है। हो सकता है कि वे कम ब्रैकेट when writing macros पर अधिक ब्रैकेट को प्राथमिकता देने की प्रवृत्ति से आते हैं।

चूंकि आप ऑटो-जनरेटेड कोड का उल्लेख करते हैं, ऐसा हो सकता है कि मैक्रोज़ उत्पन्न करने के लिए इस्तेमाल किया गया कोड मैक्रोज़ उत्पन्न करने के लिए कोड का पुन: उपयोग करके लिखा गया था या एक व्यक्ति ने सोचा था कि अधिक ब्रैकेट चोट नहीं पहुंचाएंगे, लेकिन कम ब्रैकेट घातक हो सकते हैं।

9

लेकिन बयान में ब्रांड्स क्यों हैं? क्या यह सी भाषा या कुछ से संबंधित है?

नहीं। जहाँ तक मैं कह सकता हूं, सी को रिटर्न स्टेटमेंट के लिए कभी भी ब्रांड्स की आवश्यकता नहीं है। ऐसा लगता है कि पहले एएनएसआई सी मानक से पहले भी मामला सामने आया था।

यह वास्तव में एक बहुत ही रोचक सवाल है, हालांकि, मैंने कुछ सी प्रोग्रामर के बीच उस शैली को प्रचलित देखा है।

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

टर्नरी?: ऑपरेटर एक अपवाद है क्योंकि यह एक ऑपरेटर है और सशर्त अभिव्यक्ति के चारों ओर कोष्ठक की आवश्यकता नहीं है, फिर भी लोग अक्सर इसकी आवश्यकता के बावजूद वहां कोष्ठक लिखते हैं। कुछ लोगों को लगता है कि यह अभिव्यक्ति को 'एक समूह' में एक अभिव्यक्ति में अभिव्यक्त करता है।

मेरा दूसरा सबसे अच्छा अनुमान यह है कि इस शैली को उस समय लोकप्रिय अन्य भाषाओं से प्रभावित था।हालांकि, उस समय लोकप्रिय, प्रक्रियात्मक विकल्पों जैसे पास्कल को उस वाक्यविन्यास की आवश्यकता नहीं थी (पास्कल के पास सी अर्थ में वापसी मूल्य भी नहीं थे बल्कि केवल आउटपुट पैरामीटर थे) इसलिए यदि यह मामला है, तो मुझे किसी भी विशेष भाषा से अवगत नहीं है जिससे इस शैली की उत्पत्ति हुई।

[व्यक्तिपरक] मैं शैलियों कि कोड को ज़रूरत से ज़्यादा सजावट की कम से कम राशि है कि क्या यह नामकरण परंपराओं या कि यह कैसे स्वरूपित करने के लिए या कि क्या अतिरिक्त कोष्ठक का उपयोग करने के लिए जहां अनावश्यक की बात आती है की आवश्यकता होती है पसंद करते हैं। मुझे लगता है कि ऐसी कोई सजावट अद्वितीय व्यक्तिगत वरीयता का विषय बनती है और सजावट कोड के एक तरीके से प्यार में पड़ती है इसका मतलब है कि किसी दिन आपको एक पूरी तरह से अलग तरीके से निपटना होगा (जब तक कि आप सख्ती से अकेले काम नहीं करते, इस मामले में मुझे तुमसे ईर्ष्या है)। [/ व्यक्तिपरक]

+0

आपने एक बहुत अच्छा अनुमान लगाया कि यह पुराने समय से ही रह सकता है। अगर कोई इसकी पुष्टि कर सकता है ... यदि यह कोडिंग शैली और अतिरिक्त कोड सजावट का मामला है तो हम इस शैली को कहीं और क्यों नहीं ढूंढ सकते (कम से कम मुझे)? हम्म, शायद यह एक रिश्ते है, किसी तरह की परंपरा है? – adf88

+0

@ adf88 मैं ऐसा मानूंगा। वापसी expr; और वापसी (expr); हालांकि, हमेशा वही होगा। संभवतः ऐसा कोई मामला नहीं हो सकता है जहां यह किसी भिन्न परिणाम का मूल्यांकन करेगा या बिना किसी ब्रांड्स के निर्माण में असफल रहा है, इसलिए यह कड़ाई से वरीयता का मामला है और लोग आज भी उसी शैली के लिए उस शैली का चयन कर सकते हैं कि कुछ पुराने स्कूल प्रोग्रामर ने पहले उस शैली को चुना (या हो सकता है कि नए प्रोग्रामर सिर्फ अपने कोड को देख रहे हों और इसे नकल कर रहे हों)। – stinky472

+0

अन्य भाषाओं के बारे में दूसरी परिकल्पना से संबंधित एक अन्य संभावित प्रभावशाली कारक लिस्प या उसके उत्तराधिकारी जैसी कार्यात्मक भाषाएं हो सकती है। लिस्प में, सब कुछ एक सख्त प्रारूप का पालन करता है जहां सब कुछ कोष्ठक के अंदर लिखा जाता है। इस तरह की एकरूपता के लिए कुछ लोगों के लिए बहुत अपील की गई थी और दूसरों द्वारा घृणा की गई थी, लेकिन जो लोग इसे पसंद करते थे, वे सी – stinky472

0

एक कारण यह है कि मैं इस के लिए देख सकते हैं:

return (ERROR_SUCCESS); 

है कि यह अवधारणा है कि ERROR_SUCCESS अपारदर्शी है व्यक्त कर रहा है। हम सभी जानते हैं कि यह 0 एल है, लेकिन हमें पर नहीं होना चाहिए।

यह काफी कमजोर कारण है।

दूसरा यह है कि यह स्थिरता के लिए ब्रांड्स का उपयोग करने के लिए सौंदर्यपूर्ण रूप से प्रसन्न है, एक और कमजोर कारण।

तो दूसरे शब्दों में, मैं इसे स्वयं उपयोग नहीं करता, लेकिन अगर किसी और ने किया तो बाहर नहीं निकलता। :)

+0

"यह अवधारणा व्यक्त करता है कि 'ERROR_SUCCESS' अपारदर्शी है? इसका क्या मतलब है? लेकिन जो कुछ भी है, कोष्ठक इसे बदलने के लिए बिल्कुल कुछ नहीं करते हैं। –

1

बस मेरे मूर्खतापूर्ण अटकलें:

#define RETURN(val) { if (val) printf("Main Exit With Error %d\n", val); return val; } 

int main(argc, argv) 
{ 
    ... 
    RETURN (E_FILENOTFOUND); 
} 
+0

प्रश्न' वापसी 'के बारे में था, न कि' वापसी '। .. कोई भी एक एकीकृत शैली को अपनाने की कोशिश कर रहा है जो वास्तविक कीवर्ड और मैक्रो प्रतिस्थापन दोनों के साथ काम करेगा - जो अन्यथा बेकार कोष्ठक को अस्पष्ट रूप से उचित ठहराएगा - सही मामले का उपयोग करेगा। यदि विभिन्न मामलों का उपयोग करना है, तो निश्चित रूप से वे केवल उपयोग करने के लिए याद रख सकते हैं जहां आवश्यक हो वहां कोष्ठक। –

2

वहाँ एक गूंगा कारण नहीं है - वापसी अधिक की तरह एक समारोह कॉल की हैं।

एक स्मार्ट कारण है - यदि कोड उत्पन्न होता है, तो कोड जनरेटर प्रायः अभिव्यक्तियों के चारों ओर कोष्ठक डालकर "इसे सुरक्षित" करते हैं, इसलिए उन्हें कभी भी लीकिंग की प्राथमिकता के बारे में चिंतित होने की आवश्यकता नहीं होती है।

7

यह वास्तव में बीएसडी कर्नेल स्रोत फ़ाइल शैली के लिए एक आवश्यकता है।

man 9 style का कहना है:

अंतरिक्ष कीवर्ड के बाद (अगर है, जबकि, के लिए, वापसी, स्विच)। वापसी बयान में

और

मान कोष्ठक में संलग्न किया जाना चाहिए।

+0

बहुत रोचक। धन्यवाद! – Kolyunya

+0

मुहावरे का उपयोग करने वाले संगठन का हवाला देते हुए यह सवाल नहीं है कि यह कुछ भी प्राप्त करता है, जो यह नहीं करता है। क्या उनकी शैली मार्गदर्शिका भी इसे औचित्य देने का प्रयास करती है? –

5

वापसी प्रकार को कम करने के लिए सी ++ 14 में decltype(auto) के उपयोग के साथ चीजें बदलती हैं। यदि ब्रांड्स का उपयोग किया जाता है तो लौटाया गया संदर्भ संदर्भ के लिए घटाया जाता है:

decltype(auto) foo1() { 
    int n; 
    return (n); // parentheses causes return type to be int& 
} 

decltype(auto) foo2() { 
    int n; 
    return n; // no parentheses causes return type to be int 
} 

template<typename T> struct TD; 

int main() 
{ 
    // main.cpp:19:22: error: aggregate 'TD<int&()> f1' has incomplete type and cannot be defined TD<decltype(foo1)> f1; 
    TD<decltype(foo1)> f1; 

    // main.cpp:20:22: error: aggregate 'TD<int()> f2' has incomplete type and cannot be defined TD<decltype(foo2)> f2; 
    TD<decltype(foo2)> f2; 
} 
संबंधित मुद्दे