2009-08-06 14 views
5

निम्नलिखित काल्पनिक उदाहरण पर विचार करें:शैली संबंधी सवाल लौटने विषय में शून्य

void HandleThat() { ... } 

void HandleThis() 
{ 
    if (That) return HandleThat(); 
    ... 
} 

इस कोड को बस ठीक काम करता है, और मैं काफी यकीन है कि यह कल्पना-मान्य है, लेकिन मैं (शायद अपने दम पर) इस असामान्य शैली पर विचार चूंकि कॉल फ़ंक्शन के परिणाम को वापस करने के लिए प्रतीत होता है, इस तथ्य के बावजूद कि दोनों कार्य शून्य होने के लिए प्रोटोटाइप किए गए हैं।

आमतौर पर, मैं देख रहा हूँ की उम्मीद करेंगे:

if (That) {HandleThat(); return;} 

जो मैं महसूस करता हूं क्या हो रहा है के रूप में कोई अस्पष्टता नहीं छोड़ देता है।

एसओ समुदाय, क्या मैं आपकी राय प्राप्त कर सकता हूं कि रिटर्निंग-शून्य कोडिंग शैली भ्रमित या समस्याग्रस्त है या नहीं? यह एक मुहावरे का अनुभव है; क्या मुझे इसका इस्तेमाल करना चाहिए या इससे बचें?

आम तौर पर मैं स्पष्टता के लिए प्रयास करता हूं और दूसरी शैली का उपयोग करता हूं। दूसरी तरफ, पहले फॉर्म के लिए एक साफता है जो मुझे कुछ हद तक आकर्षित करती है।

+0

यदि यह किसी भी ब्याज के मामले में है, तो इसका वास्तविक उपयोग कुछ परिस्थितियों में माता-पिता को जमानत देना है। जैसे: शून्य derivedclass :: एफ (...) {अगर (जमानत) वापसी parentclass :: एफ (...); ...} –

उत्तर

13

मैं आपसे सहमत हूं, पहली शैली भ्रमित है क्योंकि इस बात का निहितार्थ है कि कुछ प्रकार का मूल्य वापस आ रहा है। असल में मुझे इसे दो बार पर पढ़ना पड़ा क्योंकि उसमें से।

फ़ंक्शन प्रोटोटाइप शून्य से लौटने पर, इसे वापस लौटना चाहिए;

+0

+1 मैं कोई अच्छा कारण नहीं देख सकता कि किसी को शून्य लौटने पर पहले सम्मेलन का उपयोग क्यों करना चाहिए। – Eric

+0

सहमत, उत्तरार्द्ध अधिक सहज और पठनीय है - निश्चित रूप से कुछ अतिरिक्त पात्रों के लायक है। – Amber

+1

उत्तरार्द्ध अधिक सहज और पठनीय है। हालांकि, पहला भी बहुत पठनीय है, और आप इससे क्या समझते हैं वह सही है। तो यह आपके अंतर्ज्ञान को तोड़ नहीं देता है। –

11

यह शायद थोड़ा सा चालाक है। यदि वह पंक्ति फ़ंक्शन के शीर्ष से कुछ पंक्तियों से अधिक समाप्त होती है, तो यह भ्रमित हो जाएगी। यह भी प्रोग्रामर कोड देख

return HandleThat(); 
शून्य वापसी प्रकार के साथ

सहसंबंधी और चतुराई यह पता लगाने से पहले वे वास्तव में कोड को समझने की जरूरत होगी। जब आप किसी अन्य शाखा में एक से अधिक चीजें कर रहे हैं, तो आपको वास्तव में ब्रेसिज़ का उपयोग करना चाहिए और चरणों को अलग-अलग लाइनों पर रखना चाहिए। अधिक जगह लेता है लेकिन समझना आसान है:

if (That) { 
    HandleThat(); 
    return; 
} 
3

इससे पहले कभी नहीं देखा।

यह गैर शून्य वापसी प्रकार के लिए एक आम मुहावरा की तरह लग रही का लाभ दिया है, तो यह बहुत आसानी से पढ़ता है ...

मैं इसे बदल नहीं होगा जब तक कि कोई दिखा सकते हैं कि यह अवैध है।

4

सी भाषा के नियमों का कहना है कि अगर लौटने वाले शून्य के रूप में घोषित एक फ़ंक्शन अभिव्यक्ति को वापस करने का प्रयास करता है, तो अभिव्यक्ति का मूल्यांकन नहीं किया जाएगा।

http://c0x.coding-guidelines.com/6.8.6.4.html

+0

दोनों शैलियों समान परिणाम उत्पन्न करते हैं। इस कोड के लिए: शून्य() {printf ("world! \ N");} शून्य बी() {printf ("हैलो,"); एक(); } आपको उम्मीद के अनुसार हैलो वर्ल्ड मिलता है। –

+1

मैंने सत्यापित किया है कि पूर्ण अनुकूलन और जीसीसी 4.0 –

+0

का उपयोग करके अलग करना मुझे तकनीकी रूप से अपरिभाषित व्यवहार लगता है। – sylvanaar

2

मुझे विश्वास है कि पहले संस्करण मुख्य रूप से टेम्पलेट प्रोग्रामिंग कम करने के लिए अनुमति दी है। यदि हैंडलटैट ने एक प्रकार टी वापस कर दिया जो शून्य हो सकता है या नहीं, तो पहले संस्करण का उपयोग करना सुविधाजनक है।

लेकिन "सामान्य" मामलों में, दूसरा संस्करण स्पष्ट है और मैं इसे पसंद करूंगा।

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