2014-10-07 16 views
6
#include <stdio.h> 

int main(void) 
{ 
    int a = 1, i = 3, x, y, z; 
    a = 1; i = 3; 
    x = a+++i; 
    a = 1; i = 3; 
    y = a++ + i; 
    a = 1; i = 3; 
    z = a + ++i; 
    printf("%d %d %d", x, y, z); 
    scanf(" "); 
    return 0; 
}  

Questo output di codice sembra essere 4 4 5. Ma perché a+++i è uguale a a++ + i?È "a +++ i" uguale a "(a ++) + i" in C

È perché i compilatori leggono sempre il codice sorgente da sinistra a destra?

Oppure perché l'operazione segue the order of precedence?

E funzionerà allo stesso modo su tutti i compilatori?

+0

relativo a [Perché non funziona a +++++ b in C?] (Http://stackoverflow.com/q/5341202/1708801) –

risposta

5

C11 di serie, parte 6.4 (Lexical elements)/4 dice (ed in C99 è lo stesso):

Se il flusso di input è stato analizzato in pre-elaborazione gettoni fino ad un determinato carattere, il pre-elaborazione token successivo è la sequenza più lunga di caratteri che potrebbero costituire un token di pre-elaborazione .

C'è anche un esempio ci:

Il programma frammento x+++++y viene analizzata come x ++ ++ + y, che viola un vincolo sulla operatori di incremento, anche se parse x ++ + ++ y potrebbe produrre una corretta espressione.

1

Non posso dire tutto, poiché l'implementazione del compilatore C potrebbe essere diversa. Ma in generale sì, hai ragione. Un compilatore C dovrebbe essere avido, cioè leggere il più possibile, quindi +++ == ++ +.

+0

Non sono stati trovati modelli in C++? –

+0

Ah, hai ragione! – Vin