Wie gibt das folgende Programm „C89“ aus, wenn es im C89-Modus kompiliert wird, und „C99“, wenn es im C99-Modus kompiliert wird?
Lesezeit: 2 Minuten
Spikatrix
Ich habe dieses C-Programm aus dem Internet gefunden:
#include <stdio.h>
int main(){
printf("C%d\n",(int)(90-(-4.5//**/
-4.5)));
return 0;
}
Das Interessante an diesem Programm ist, dass es druckt, wenn es kompiliert und im C89-Modus ausgeführt wird C89 und wenn es kompiliert und im C99-Modus ausgeführt wird, wird es gedruckt C99. Aber ich kann nicht herausfinden, wie dieses Programm funktioniert.
Können Sie erklären, wie das zweite Argument von printf funktioniert in dem oben genannten Programm?
Hinweis: der C++-Stil // Kommentar wurde in C99 eingeführt.
– PaulR
29. Juni 2015 um 12:17 Uhr
Netter Trick – aber er scheitert mit gcc. Ohne std=c99 Sie erhalten eine Warnung, und wenn Sie sie ignorieren, gcc Wille still interpretieren die // als Beginn eines Kommentars (ah – Sie müssen verwenden -pedantic auch. Ich habe das standardmäßig aktiviert.)
– Jongware
29. Juni 2015 um 12:20 Uhr
@Jongware Nun, ich habe C89 mit explizit std=c89 in gcc 4.9.2.
– ich
29. Juni 2015 um 12:24 Uhr
Nur für den Fall, dass jemand dies findet, während er nach einer Möglichkeit sucht, die C99-Unterstützung zu testen; Bitte verwenden Sie so etwas wie #if __STDC_VERSION__ >= 199901Lnicht der // Kommentar-Trick. =)
– Arkku
29. Juni 2015 um 12:30 Uhr
Es druckt auch “C99” für C11 …
– Ludin
29. Juni 2015 um 12:55 Uhr
Paul Rubel
C99 erlaubt //-Stil-Kommentare, C89 nicht. Also zum übersetzen:
Da // Kommentare existieren nur in C99 und späteren Standards, der Code entspricht dem 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;
}
Richtiger 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;
}
Off-by-One-Fehler in Ihrer Antwort, wie bekommen Sie 90, wenn es 89 drucken soll?
– Pimgd
29. Juni 2015 um 13:18 Uhr
@ Pimgd C89 und C90 ist dasselbe. stackoverflow.com/questions/17206568/…
– Ludin
29. Juni 2015 um 13:45 Uhr
Sie bedeuten dasselbe, aber es ist nicht dieselbe Zeichenfolge. Stehe zu meiner ursprünglichen Frage.
– Pimgd
30. Juni 2015 um 7:41 Uhr
@Pimgd Der Zweck des obigen Codes besteht nicht darin, eine künstliche Aufgabe zum Drucken von Zeichenfolgen nach einem bestimmten Format zu erfüllen. Der Zweck besteht darin, zu demonstrieren, wie reale Anwendungen außerhalb der IOCCC gibt aus, mit welcher C-Version das Programm kompiliert wurde. C90 ist korrekter zu verwenden als “C89” oder “ANSI-C”.
– Ludin
30. Juni 2015 um 9:23 Uhr
14232300cookie-checkWie gibt das folgende Programm „C89“ aus, wenn es im C89-Modus kompiliert wird, und „C99“, wenn es im C99-Modus kompiliert wird?yes
Hinweis: der C++-Stil
//
Kommentar wurde in C99 eingeführt.– PaulR
29. Juni 2015 um 12:17 Uhr
Netter Trick – aber er scheitert mit
gcc
. Ohnestd=c99
Sie erhalten eine Warnung, und wenn Sie sie ignorieren,gcc
Wille still interpretieren die//
als Beginn eines Kommentars (ah – Sie müssen verwenden-pedantic
auch. Ich habe das standardmäßig aktiviert.)– Jongware
29. Juni 2015 um 12:20 Uhr
@Jongware Nun, ich habe
C89
mit explizitstd=c89
in gcc 4.9.2.– ich
29. Juni 2015 um 12:24 Uhr
Nur für den Fall, dass jemand dies findet, während er nach einer Möglichkeit sucht, die C99-Unterstützung zu testen; Bitte verwenden Sie so etwas wie
#if __STDC_VERSION__ >= 199901L
nicht der//
Kommentar-Trick. =)– Arkku
29. Juni 2015 um 12:30 Uhr
Es druckt auch “C99” für C11 …
– Ludin
29. Juni 2015 um 12:55 Uhr