2015-01-01 17 views
6

E 'K & R-C e qui è tutto il codice: http://v6shell.org/history/if.cPerché dovresti tornare (0 * ap ++)?

Guardate questa funzione:

char *nxtarg() { 
    if (ap>ac) return(0*ap++); 
    return(av[ap++]); 
} 

1.Question: Perché ritorno (0 * ap ++)? Ok, vuoi restituire 0 e aumentare l'AP di 1. Ma perché così? È più veloce di if (ap>ac) {ap++; return 0;}?

2.Question: Il tipo di ritorno di nxtarg deve essere char *, perché è possibile restituire 0, un intero?

+0

Si prega di dividere la domanda in due. Dato che c'è già una risposta al primo, suggerirei di ritirare il secondo. –

+4

(Perché hai uno stile di codifica orrendo?) Seriamente, non farlo. –

+2

Il codice che hai deciso di guardare per qualche motivo è un pessimo esempio di pratica C moderna, anche se è di interesse storico. Potresti fare una domanda per ciascuna funzione in quel file e non imparare nulla di utile nel processo. O potresti trovare un codice migliore da leggere. Vorrei raccomandare il codice sorgente di musl: http://www.musl-libc.org –

risposta

7

Questo è un piccolo trucco per spremere l'incremento in un'istruzione che restituisce zero. E 'logicamente equivalente a un condizionale

if (ap > ac) { 
    ap++; 
    return 0; 
} 

o meglio ancora con un comma operator:

return (ap++, (char *)0); // Thanks, Jonathan Leffler 

Nota che, poiché lo zero nel tuo esempio non è una costante in fase di compilazione, l'espressione ha bisogno di un cast di essere conforme allo standard:

if (ap>ac) return (char*)(0*ap++); 

per quanto restituendo un intero pari a zero va, viene considerato pari a NULL puntatore quando usato in po inter contesto.

+0

Questo non è un puntatore NULL perché '0 * ap ++' non è un'espressione costante. La conversione nel codice OP richiede un cast in standard C. Il codice fornito in questa risposta, d'altra parte, è strettamente conforme. – mafso

+0

@mafso Grazie mille per il commento! Ho modificato la risposta per riflettere il punto sulla conversione richiesta. Grazie! – dasblinkenlight

+0

Anche con il cast, non sono sicuro che il comportamento sia ben definito (anche se sono sicuro che funziona in pratica). –

2

L'operatore ++ incrementerà il valore e restituirà il valore prima che fosse incrementato. Se la funzione doveva restituire un puntatore, è possibile restituire zero o NULL, per indicare un puntatore NULL.

Problemi correlati