2013-01-05 13 views
5

उदाहरण के एक बहुत में मैं एक साधारण getListLength() फ़ंक्शन यह कुछ ऐसा दिखाई देगा पढ़ा है के रूप में: क्या मुझे अनावश्यक रूप हमलों एक स्थानीय सूचक की घोषणा (हैप्वाइंटर सी कार्यों में तर्क

int getListLength(struct node *head) 
{ 
    struct node *temp = head; 
    int iCount = 0; 

    while (temp) 
    { 
     ++iCount; 
     temp = temp->next; 
    } 

    return iCount; 
} 

इस मामले में * अस्थायी) जो पारित पैरामीटर की प्रतिलिपि बनाता है। अगर मैं सही ढंग से याद करता हूं, तो पारित पैरामीटर अपनी प्रतियां प्राप्त करते हैं। इस प्रकार, स्थानीय सूचक की आवश्यकता नहीं होगी जो * सिर की प्रतिलिपि बनाता है क्योंकि * सिर एक प्रतिलिपि है, है ना? दूसरे शब्दों में, क्या * temp सूचक को त्यागना और इसके बजाय हर जगह सिर का उपयोग करना सही होगा?

उत्तर

4

हां, यह एक प्रति है, इसलिए हाँ, यह सही होगा।

int getListLength(struct node* head) 
{ 
    int iCount = 0; 

    while (head) 
    { 
     ++iCount; 
     head = head->next; 
    } 
    return iCount; 
} 

आप इसे क्यों निष्पादित नहीं करते हैं और खुद के लिए देखते हैं?

4

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

+0

"जब कोड लंबा और अधिक जटिल होता है।" - मैं इसके साथ बहस कर सकता था। यदि कोई कार्य एक ओपी से अधिक लंबा है, और यदि यह इतना जटिल है कि यह एक से अधिक कार्य करता है और किसी को चर नामों को याद रखने की आवश्यकता होती है, तो उस फ़ंक्शन को फिर से क्रियान्वित किया जाना चाहिए। –

+0

यह शायद सच है, लेकिन असली दुनिया शायद ही कभी सही हो सकती है जैसा कि चाहें। – jjlin

2

अक्सर, पास-इन पॉइंटर की स्थानीय प्रतिलिपि बनाने का कारण फ़ंक्शन के side-effects को कम करना है (फ़ंक्शन पैरामीटर को संशोधित नहीं करके)।

एक समारोह केवल सूचक का उपयोग कर पढ़ने के लिए (नहीं लिख) है, और बाहर की दुनिया साथ कोई अन्य संपर्क, समारोह जीसीसी में के रूप में 'शुद्ध' पर टिप्पणी की जा सकता है और खुला होना चाहते हैं कुछ अच्छे अनुकूलन के लिए।

उदाहरण:

__attribute__((pure)) int getListLength(struct node *head) 
{ 
    struct node *temp = head; 
    int iCount = 0; 

    while (temp) 
    { 
     ++iCount; 
     temp = temp->next; 
    } 

    return iCount; 
} 

आप क्या दुष्प्रभाव होते हैं से परिचित नहीं हैं, तो Side Effects और Functional Programming विकिपीडिया लेख पढ़ने के विषय में अधिक जानकारी प्राप्त करने की कोशिश।

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