2015-06-29 6 views
122

Ich habe dieses C-Programm aus dem Web gefunden:Wie gibt das folgende Programm "C89" aus, wenn es im C89-Modus kompiliert wird, und "C99", wenn es im C99-Modus kompiliert wird?

#include <stdio.h> 

int main(){ 

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

    return 0; 
} 

Das Interessante an diesem Programm ist, dass, wenn es kompiliert und in C89-Modus ausgeführt, er druckt C89 und wenn es kompiliert und ausgeführt wird in C99 Modus, druckt es C99. Aber ich kann nicht herausfinden, wie dieses Programm funktioniert.

Können Sie erklären, wie das zweite Argument von printf im obigen Programm funktioniert?

+44

Hinweis: Der C++ - Stil '//' Kommentar wurde in C99 eingeführt. –

+3

Netter Trick - aber es scheitert mit 'gcc'. Ohne 'std = c99' erhalten Sie eine Warnung, und wenn Sie sie ignorieren, interpretiert' gcc' das * // 'noch als Anfang eines Kommentars (ah - Sie müssen auch' -pedantic' verwenden Ich habe das standardmäßig.) – usr2564301

+3

@Jongware Nun, ich habe 'C89' mit expliziten' Std = c89' in gcc 4.9.2. – ikh

Antwort

132

C99 ermöglicht //-Stil Kommentare, C89 nicht. Also, zu übersetzen:

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

die Leitung Kommentar // ist seit C99 eingeführt. Daher Ihren Code dies in C89 gleich

#include <stdio.h> 

int main(){ 

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

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

und gleich dies in 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

Da // Kommentare nur in C99 und später Normen existieren, ist der Code entspricht der folgenden:

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

Korrekter Code wäre:

#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

Off-by-One-Fehler in Ihrer Antwort, wie bekommen Sie 90, wenn es 89 drucken soll? – Pimgd

+1

@Pimgd C89 und C90 ist die gleiche Sache. http://stackoverflow.com/questions/17206568/what-ist-the-difference-between-c-c99-ansi-c-and-gnu-ca-general-confusion-reg/17209532#17209532 – Lundin

+3

Sie meinen das gleiche Ding, aber es ist nicht die gleiche Zeichenfolge. Steh auf meine ursprüngliche Frage. – Pimgd

Verwandte Themen