2017-01-21 2 views
3

ich diese Frage von einer Website bekam fragt die Ausgabe des Codes gebenPassing zwei Werte mit Klammern in einer einzigen Argumente Funktion

void reverse(int i) 
{ 
    if (i > 5) 
     return ; 
    printf("%d ", i); 
    return reverse((i++, i)); 
} 
int main(int argc, char *argv[]) { 
    reverse(1); 
    return 0; 
} 

Ausgang ist 1 2 3 4 5

aber reverse Funktion rekursiv zwei genannt ist vorbei Werte in Klammern. Wie funktionieren Präzedenz und Assoziativität hier?

Antwort

5

, in (i++, i) ist ein Komma-Operator. Die Operanden werden von links nach rechts ausgewertet. Es wertet i++ aus, Wert von i wird inkrementiert und der Wert des Ausdrucks i++ wird verworfen und dann wird der inkrementierte Wert an die Funktion übergeben. Es wird also letztlich nur ein einziges Argument an die Funktion reverse übergeben.

4

Dies ist nicht zwei Werte mit zusätzlichen Klammern, aber ein Argument, das ein comma operator enthält.

3

Nach haccks, hier ist ein Komma-Operator.

Der Ausdruck:

(i++, i) 

Erste expression1 ausgewertet wird, dann expression2 wird ausgewertet und der Wert von expression2 ist für den gesamten Ausdruck zurückgegeben.

1

Explaination:

void reverse(int i) 
{ 
    if (i > 5) 
     return ; 
    printf("%d ", i); 
    return reverse((i++, i)); // it's single arument that is (i++ , i) 
} 
int main(int argc, char *argv[]) { 
    reverse(1); 
    return 0; 
} 

Mehr explaination wie

a = (1, 2, 3); 

(1,2,3) ist ein einziges Argument aber, was eine zugeordnet ist?

Klammern sind so Komma-Operator wird zuerst ausgeführt und wir bekommen die a zugewiesen als 3 so Aussagen vor Kommas verwenden zuerst ausgeführt werden und 3

In Ihrem Fall
i++ wird zuerst und dann ausgeführt zugewiesen i wird als Argument

übergeben
Verwandte Themen