2012-07-24 12 views
7

संख्या के अंकों को दोबारा जोड़कर एक अंक को दिए गए नंबर को कम करने के लिए कोड निम्नलिखित है।कोड को तार्किक रूप से गलत होने पर भी मुझे सही आउटपुट क्यों मिल रहा है

उदाहरण के लिए यदि इनपुट 845 आउटपुट 8 है। 8+4+5 = 17 -> 1+7 = 8if (sum > 9) ब्लॉक में (उत्पादन)

#include <stdio.h> 
#define TRUE 1 

int reduceToSingle(int numb); 

int main() 
{ 
    int numb; 
    scanf("%d",&numb); 
    printf("Original = %d Single digit = %d\n", numb, reduceToSingle(numb)); 

    return TRUE; 
} 

int reduceToSingle(int numb) 
{ 
    int sum = 0, digit = 0; 
    for (digit = numb % 10; numb != 0; numb = numb/10) 
    { 
     digit = numb % 10; 
     sum += digit; 
    } 

    if (sum > 9) 
     reduceToSingle(sum); 
    else 
     return sum; 
} 

उपरोक्त कोड में मैं समारोह मान दिया नहीं किया है। मैंने बस इसके बजाय समारोह बुलाया। तर्कसंगत रूप से इस फ़ंक्शन को गलत मान देना चाहिए। लेकिन जब मैंने अपने सिस्टम में उपरोक्त प्रोग्राम चलाया तो मुझे आउटपुट में अंकों का सही योग मिला। मैं इस व्यवहार के पीछे तर्क को समझने में असमर्थ हूं।

+0

यदि आप अपने डीबगर का उपयोग करके कोड के माध्यम से कदम उठाते हैं तो आप देखेंगे कि क्या हो रहा है। –

+0

इसके पीछे तर्क नहीं है। अपरिभाषित व्यवहार वाले एक कार्यक्रम में * किसी भी * परिणाम हो सकते हैं, जिसमें आप उम्मीद करते हैं। –

+0

इस अन्य प्रश्न में, 5 उत्तरों में से केवल 1 "सही" है [किसी संख्या के अंकों की गणना करने के लिए रिकर्सिव फ़ंक्शन से गलत आउटपुट] (http://stackoverflow.com/questions/7045189/incorrect-output-from- रिकर्सिव-फ़ंक्शन-टू-कंप्यूट-सम-ऑफ-ऑफ-ए-नंबर) –

उत्तर

7

यह सिर्फ अपरिभाषित व्यवहार है और मुझे यकीन है कि आपको चेतावनी मिली है। यह काम करने के लिए होता है - कंपाइलर सेटिंग्स को ट्विक करें या कंपाइलर को पूरी तरह से बदलें और यह अब और नहीं होगा।

इस मामले में मुझे संदेह है कि eax क्लॉग्नेड नहीं है, इसलिए आपको अपेक्षित मूल्य मिलता है, यानी किसी भी कॉल द्वारा अंतिम मूल्य return एड। तो जब आप reduceToSingle पर कॉल करते हैं, तो अंत में यह return (जब sum <= 9) तक पहुंच जाएगा। तब से eax के मूल्य पर मूल कॉलर पर उलझ जाएंगे।

+0

हां, जब मैंने इसे संकलित किया -वॉल विकल्प सक्षम किया गया तो मुझे चेतावनी चेतावनी के बाद फेंक दिया गया: नियंत्रण गैर-शून्य कार्य के अंत तक पहुंच गया [- Wreturn-type] क्या आप कृपया मुझे बता सकते हैं कि इस तरह के अपरिभाषित व्यवहार से छुटकारा पाने के लिए कंपाइलर इनऑर्डर को कैसे ट्विक करें? – svKris

+0

@ एसवीक्रिस नहीं, आप ऐसा नहीं कर सकते हैं। हालांकि आप इसे पहले स्थान पर नहीं लिख सकते हैं। – cnicutar

+0

आप जीसीसी 4.4 + –

1

यह मैं

815 
Original = 815 Single digit = 2009291924 
अपने कोड reduceToSingle (सुन्न) कोड में किसी भी मूल्य नहीं लौटा रहा है में

क्या मिल गया तो यह की तरह

printf("%d %d",12); 

तो एक कचरा मूल्य के लिए छपा है कुछ है अन्य प्रारूप विनिर्देश

+1

पर एक त्रुटि के लिए उस चेतावनी को बदल सकते हैं यह मेरे लिए 5 (सही मूल्य) दे रहा है –

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