2015-06-29 34 views
122

Ho trovato questo programma C dal web:In che modo il programma seguente emette `C89` quando è compilato in modalità C89 e` C99` quando è compilato in modalità C99?

#include <stdio.h> 

int main(){ 

    printf("C%d\n",(int)(90-(-4.5//**/ 
    -4.5))); 

    return 0; 
} 

La cosa interessante con questo programma è che quando viene compilato ed eseguito in modalità C89, stampa C89 e quando viene compilato ed eseguito in C99 modalità, stampa C99. Ma non sono in grado di capire come funziona questo programma.

Puoi spiegare come il secondo argomento di printf funziona nel programma sopra?

+44

Suggerimento: il commento in stile '/' di C++ è stato introdotto in C99. –

+3

Bel trucco - ma fallisce con 'gcc'. Senza 'std = c99' riceverai un avvertimento, e se lo ignori,' gcc' interpreterà * ancora * il '//' come inizio di un commento (ah - devi usare '-pedantic' come bene Ho attivato per impostazione predefinita.) – usr2564301

+3

@Jongware Bene, ho ottenuto 'C89' con esplicito' std = c89' in gcc 4.9.2. – ikh

risposta

132

C99 consente commenti in stile //, C89 no. Così, da tradurre:

C99:

printf("C%d\n",(int)(90-(-4.5  /*Some comment stuff*/ 
         -4.5))); 
// Outputs: 99 

C89:

printf("C%d\n",(int)(90-(-4.5/  
         -4.5))); 
/* so we get 90-1 or 89 */ 
25

la riga di commento // viene introdotto dal C99. Quindi il codice è uguale a questo in C89

#include <stdio.h> 

int main(){ 

    printf("C%d\n",(int)(90-(-4.5/ 
-4.5))); 

    return 0; 
} 
/* 90 - (-4.5/-4.5) = 89 */ 

e pari a questo C99

#include <stdio.h> 

int main(){ 

    printf("C%d\n",(int)(90-(-4.5 
-4.5))); 

    return 0; 
} 
/* 90 - (-4.5 - 4.5) = 99*/ 
9

Perché // commenti esistere solo in C99 e gli standard più tardi, il codice è equivalente al seguente:

#include <stdio.h> 

int main (void) 
{ 
    int vers; 

    #if __STDC_VERSION__ >= 201112L 
    vers = 99; // oops 
    #elif __STDC_VERSION__ >= 199901L 
    vers = 99; 
    #else 
    vers = 90; 
    #endif 

    printf("C%d", vers); 

    return 0; 
} 

codice corretto sarebbe:

#include <stdio.h> 

int main (void) 
{ 
    int vers; 

    #if __STDC_VERSION__ >= 201112L 
    vers = 11; 
    #elif __STDC_VERSION__ >= 199901L 
    vers = 99; 
    #else 
    vers = 90; 
    #endif 

    printf("C%d", vers); 

    return 0; 
} 
+0

errore nella risposta, come si ottiene 90 quando si suppone di stampare 89? – Pimgd

+1

@Pimgd C89 e C90 sono la stessa cosa. http://stackoverflow.com/questions/17206568/what-is-the-difference-between-c-c99-ansi-c-and-gnu-ca-general-confusion-reg/17209532#17209532 – Lundin

+3

Intendono lo stesso cosa ma non è la stessa stringa. In attesa della mia domanda iniziale. – Pimgd