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

Benutzeravatar von Spikatrix
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

Benutzeravatar von Paul Rubel
Paul Rubel

C99 erlaubt //-Stil-Kommentare, C89 nicht. Also zum ü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 */

der Zeilenkommentar // wird seit C99 eingeführt. Daher ist Ihr Code 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 diesem 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*/

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

1423230cookie-checkWie gibt das folgende Programm „C89“ aus, wenn es im C89-Modus kompiliert wird, und „C99“, wenn es im C99-Modus kompiliert wird?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy