2012-05-21 18 views
5

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

यह फ़ंक्शन क्या पूरा करता है?

void add2numbers(double a, double b) 
    { 
     double sum; 
     sum = a + b; 
    } 
+4

किसी काम के लिए बहुत सी चीजें हैं, कुछ वापस करने के अलावा ... –

+4

आप [_side effect_] (http://en.wikipedia.org/wiki/Side_effect_ (computer_science) की अवधारणा को याद कर रहे हैं)। – ildjarn

+0

वह फ़ंक्शन कुछ भी नहीं करता है, और –

उत्तर

3

एक शून्य समारोह के उद्देश्य के एक पक्ष प्रभाव प्राप्त करने के लिए है (उदाहरण के लिए, एक संदर्भ पैरामीटर या एक वैश्विक चर संशोधित ऐसी आई/ओ, आदि के रूप सिस्टम कॉल प्रदर्शन), एक मूल्य वापस नहीं।

8
void ReturnsNothing() 
{ 
    cout << "Hello!"; 
} 

आप देख सकते हैं, इस समारोह रिटर्न कुछ भी नहीं है, लेकिन वह समारोह मतलब यह नहीं है कुछ नहीं करता है।

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

+2

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

1

शून्य वापसी मूल्य वाला एक फ़ंक्शन इसके दुष्प्रभावों के लिए उपयोगी हो सकता है। उदाहरण के लिए मानक पुस्तकालय समारोह exit पर विचार करें:

void exit(int status) 

इस समारोह आप को कोई मूल्य वापस नहीं करता है, लेकिन यह अभी भी प्रक्रिया समाप्त करने के अपने पक्ष प्रभाव के लिए उपयोगी है।

1

कि समारोह कुछ भी नहीं प्राप्त होता है - लेकिन अगर आप

void add2numbers(double a, double b, double &sum) 
{   
    sum = a + b; 
} 

लिखा था यह आप योग देना होगा, चाहे वह आसान है कोई मान या का उपयोग एक पैरामीटर क्या तुम करोगी समारोह पर

आमतौर पर निर्भर करता है के लिए यदि कई परिणाम हैं तो पैरामीटर का उपयोग करें, लेकिन मान लें कि आपके पास गणित नियमित है जहां एक उत्तर संभव नहीं हो सकता है।

bool sqrt(double value, double &answer) 
{ 
    if value < 0.0) { 
     return false; 
    } else { 
     answer = real_sqrt_function(value); 
     return true; 
    } 
} 
5

इनमें से कुछ 'गैर शुद्ध' साइड इफेक्ट कर रहे हैं कारणों का भार शून्य कार्य करने के लिए कर रहे हैं,:

int i=9; 
void f() { 
    ++i; 
} 

इस मामले i में वैश्विक या एक वर्ग डेटा सदस्य हो सकता है।

अन्य है नमूदार प्रभाव

void f() { 
    std::cout <<"hello world" << std::endl; 
} 

एक शून्य समारोह एक संदर्भ या सूचक मूल्य पर कार्रवाई हो सकती है।

void f(int& i) { 
    ++i; 
} 

यह भी फेंक सकता है, हालांकि प्रवाह नियंत्रण के लिए ऐसा नहीं करते हैं।

void f() { 
    while(is_not_broke()) { 
     //... 
    } 
    throw std::exception(); //it broke 
} 
1

आप सही तर्ज पर कर रहे हैं - समारोह किसी बात की पूर्ति नहीं करता, क्योंकि यह कुछ लेकिन है कि कुछ तो दूर फेंक दिया जाता है गणना करता है।

शून्य लौटने वाले कार्य उपयोगी हो सकते हैं क्योंकि उनके पास "दुष्प्रभाव" हो सकते हैं। इसका मतलब है कि कुछ ऐसा होता है जो फ़ंक्शन का इनपुट या आउटपुट नहीं होता है। उदाहरण के लिए यह एक फाइल को लिख सकता है, या एक ईमेल भेज सकता है।

2

सी/सी ++ के संदर्भ में फ़ंक्शन शब्द का उपयोग भ्रमित करने वाला है, क्योंकि यह किसी फ़ंक्शन की गणितीय अवधारणा को "कुछ मूल्य लौटने" के रूप में असहमत करता है। क्या सी/सी ++ कॉल शून्य लौटने वाले फ़ंक्शन अन्य भाषाओं में प्रक्रिया की अवधारणा से मेल खाते हैं।

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

1

फ़ंक्शन इस मामले में मिसनोमर का थोड़ा सा है; शायद इसे एक विधि बुलाओ बेहतर है। आप किसी वस्तु पर अपनी स्थिति बदलने के लिए एक विधि को कॉल कर सकते हैं, यानी इसके फ़ील्ड (या गुण) के मान। तो आपके पास x और y निर्देशांक के लिए उचित वस्तुएं हो सकती हैं और मूव नामक एक विधि हो सकती है जो पैरामीटर xDelta और yDelta लेता है।

कॉलिंग 2, 3 के साथ ले जाने से आपके एक्स प्रॉपर्टी में 2 जोड़ा जाएगा और 3 आपकी वाई प्रॉपर्टी में जोड़ा जाएगा। तो वस्तु की स्थिति बदल गई है और मूव ने मूल्य वापस करने के लिए मस्तिष्क की भावना नहीं बनाई होगी।

0

मैं वर्तमान में VTK नामक विज़ुअलाइजेशन लाइब्रेरी का उपयोग करता हूं। मैं आमतौर पर स्क्रीन पर प्रदर्शित ग्राफिक्स के कुछ हिस्से को अपडेट करने के लिए शून्य कार्य लिखता हूं। मैं क्यूटी के भीतर जीयूआई बातचीत को संभालने के लिए शून्य कार्यों का भी उपयोग करता हूं। उदाहरण के लिए, यदि आप एक बटन पर क्लिक करते हैं, तो कुछ पाठ जीयूआई पर अपडेट हो जाता है।

0

आप पूरी तरह से सही हैं: किसी फ़ंक्शन की गणना करना जो कुछ भी नहीं लौटाता है, अर्थहीन है - यदि आप गणितीय कार्यों के बारे में बात कर रहे हैं। लेकिन कई गणितीय अवधारणाओं की तरह, "फ़ंक्शंस" कई प्रोग्रामिंग भाषाओं में हैं जो केवल गणितीय कार्यों से संबंधित हैं, लेकिन कम या ज्यादा कम व्यवहार करते हैं।

मुझे विश्वास है कि पर यह भाषा गलत नहीं है: ऐसी एक भाषा Haskell है। यह एक पूरी तरह से कार्यात्मक भाषा है जिसका अर्थ है कि हास्केल फ़ंक्शन भी गणितीय फ़ंक्शन है। वास्तव में आप हास्केल कार्यों को और अधिक गणितीय-स्टाइल लिख सकते हैं, उदा।

my_tan(x) = sin(x)/cos(x)   -- or (preferred): tan' x = sin x/cos x 
सी ++

double my_tan(double x) { return sin(x)/cos(x); } 

हालांकि, कंप्यूटर प्रोग्राम में आप नहीं बस कार्यों गणना करना चाहते हैं की तुलना में

, है न? आप अपनी स्क्रीन पर कुछ प्रदर्शित करने, नेटवर्क पर डेटा भेजने, सेंसर आदि से मूल्य पढ़ने जैसे सामान प्राप्त करना चाहते हैं .. हास्केल में, इन चीजों को अच्छी तरह से शुद्ध कार्यों से अलग किया जाता है, वे सभी तथाकथित में कार्य करते हैं IO मोनड। उदाहरण के लिए, putStrLn फ़ंक्शन, जो वर्णों की एक पंक्ति मुद्रित करता है, में String -> IO() टाइप किया गया है।मतलब, यह String को इसके तर्क के रूप में लेता है और IO क्रिया देता है जो main फ़ंक्शन से लागू होने पर उस स्ट्रिंग को प्रिंट करता है, और कुछ और नहीं (() माता-पिता लगभग void सी ++ में हैं)।

आईओ करने का यह तरीका कई फायदे हैं, लेकिन अधिकांश प्रोग्रामिंग भाषाएं अधिक मैला हैं: वे सभी आईओ करने के लिए फ़ंक्शंस को अनुमति देते हैं, और आपके प्रोग्राम की आंतरिक स्थिति को भी बदलने के लिए अनुमति देते हैं। तो सी ++ में, आप केवल void putStrLn(std::string) फ़ंक्शन कर सकते हैं, जो स्ट्रिंग को प्रिंट करता है और कुछ भी नहीं, जो एक आईओ क्रिया "रिटर्न" करता है, लेकिन स्पष्ट रूप से आपको ऐसा नहीं बताता है। लाभ यह है कि आईओ मोनैड वास्तव में क्या है (यह बल्कि चौराहे है) के बारे में सोचते समय आपको अपने मस्तिष्क में कई नॉट्स बांधने की आवश्यकता नहीं है। इसके अलावा, यदि आपके पास वास्तव में मशीन को "प्रक्रियाओं का अनुक्रम करें, अब!" कहने की क्षमता है तो कई एल्गोरिदम को तेज़ी से चलाने के लिए कार्यान्वित किया जा सकता है! आईओ मोनड में कुछ गणना के परिणाम मांगने के बजाय।

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