2012-07-24 10 views
7

Di seguito è riportato il codice per la riduzione di un determinato numero a una singola cifra aggiungendo le cifre del numero in modo ricorsivo.Perché ottengo l'output corretto anche se il codice è logicamente errato

Ad esempio se l'ingresso è 845 l'uscita è 8. 8+4+5 = 17 -> 1+7 = 8 (uscita)

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

Nel codice precedente nel blocco if (sum > 9) non ho restituito il valore della funzione. Ho appena chiamato la funzione. Logicamente questa funzione dovrebbe dare un valore errato. Ma quando ho eseguito il programma di cui sopra nel mio sistema ho ottenuto la somma corretta di cifre in uscita. Non sono in grado di comprendere la logica dietro questo comportamento.

+0

Se si passa attraverso il codice utilizzando il debugger, si vedrà cosa sta succedendo. –

+0

Non c'è logica dietro. Un programma con comportamento non definito può avere * qualsiasi * risultato, incluso quello che ci si aspetta. –

+0

In questa domanda, solo 1 risposta su 5 è "corretta" [Output non corretto dalla funzione ricorsiva per calcolare la somma di cifre di un numero] (http://stackoverflow.com/questions/7045189/incorrect-output-from- funzione ricorsiva-a-computare-somma-di-cifre-di-un-numero) –

risposta

7

È solo un comportamento non definito e sono sicuro che hai ricevuto un avviso. È succede per lavorare - modificare le impostazioni del compilatore o modificare il compilatore del tutto e non sarà più.

In questo caso, sospetto che lo eax non sia danneggiato, quindi si ottiene il valore previsto, ovvero l'ultimo valore return da una qualsiasi delle chiamate. Quindi quando chiami reduceToSingle, alla fine raggiungerà return (quando sum <= 9). Da quel momento il valore di eax si ridurrà al chiamante originale.

+0

sì, quando l'ho compilato con l'opzione -Wall abilitata sono stato gettato th in seguito ad avvertimento: il controllo raggiunge la fine della funzione non vuota [- Wreturn-type] Inoltre, potresti dirmi come modificare il compilatore per eliminare questo comportamento indefinito? – svKris

+0

@svKris No, non puoi farlo. Puoi comunque non scriverlo in primo luogo. – cnicutar

+0

è possibile modificare questo avviso per un errore su gcc 4.4+ –

1

Questo è ciò che ho ottenuto

815 
Original = 815 Single digit = 2009291924 

nel reduceToSingle codice (insensibile) non restituisce alcun valore nel codice in modo che è qualcosa di simile

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

così un valore di immondizia viene stampato per l'altro specificatore di formato

+1

per me sta dando 5 (valore corretto) –

Problemi correlati