2012-07-24 4 views
7

Nachfolgend ist der Code zum Reduzieren einer gegebenen Zahl auf eine einzelne Ziffer durch rekursives Hinzufügen der Ziffern der Zahl angegeben. Wenn der Eingang 845 ist, lautet die Ausgabe 8. 8+4+5 = 17 -> 1+7 = 8 (output)Warum erhalte ich eine korrekte Ausgabe, obwohl der Code logisch falsch ist

#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; 
} 

In dem obigen Code in dem Block if (sum > 9) Ich habe nicht den Funktionswert zurückgegeben. Ich habe gerade die Funktion aufgerufen. Logisch sollte diese Funktion einen falschen Wert ergeben. Aber wenn ich das obige Programm in meinem System laufen ließ, bekam ich die korrekte Summe der Ziffern in der Ausgabe. Ich bin nicht in der Lage, die Logik hinter diesem Verhalten zu verstehen.

+0

Wenn Sie mit Ihrem Debugger durch den Code gehen, werden Sie sehen, was passiert. –

+0

Es gibt keine Logik dahinter. Ein Programm mit nicht definiertem Verhalten kann * any * Ergebnis haben, einschließlich des erwarteten. –

+0

In dieser anderen Frage ist nur 1 von 5 Antworten "korrekt" [Falsche Ausgabe der rekursiven Funktion zur Berechnung der Ziffernsumme einer Zahl] (http://stackoverflow.com/questions/7045189/incorrect-output-from- recursive-function-to-compute-summer-of-a-nummern) –

Antwort

7

Es ist nur undefined Verhalten und ich bin sicher, Sie haben eine Warnung erhalten. Es passiert zu arbeiten - zwicken die Compiler-Einstellungen oder ändern Sie den Compiler insgesamt und es wird nicht mehr.

In diesem Fall vermute ich eax nicht verprügelt wird, so dass Sie den Erwartungswert erhalten, das heißt den letzten Wert return durch eine des Anrufs ed. Wenn Sie reduceToSingle anrufen, wird es schließlich return erreichen (wenn sum <= 9). Von nun an wird der Wert von eax auf den ursprünglichen Aufrufer heruntersickern.

+0

ja, wenn ich kompiliert es mit -Wall-Option aktiviert war ich geworfen th folgende Warnung Warnung: Kontrolle erreicht Ende der nicht-void-Funktion [- Wreturn-Typ] Kannst du mir bitte auch sagen, wie man den Compiler zwickt, um so undefiniertes Verhalten loszuwerden? – svKris

+0

@svKris Nein, das geht nicht. Sie können es jedoch nicht an erster Stelle schreiben. – cnicutar

+0

Sie können diese Warnung in einen Fehler auf gcc 4.4 + –

1

Das ist, was ich

815 
Original = 815 Single digit = 2009291924 

in Ihrem Code reduceToSingle bekam (taub) ist jeder Wert in dem Code nicht zurückkehrt, so dass es so etwas wie

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

so ein Müllwert gedruckt wird, ist für der andere Formatbezeichner

+1

für mich ändern es gibt 5 (korrekter Wert) –

Verwandte Themen