web-dev-qa-db-ja.com

以下のプログラムは、C89モードでコンパイルされたときに `C89`を、C99モードでコンパイルされたときに` C99`をどのように出力しますか?

私はこのCプログラムをウェブから見つけました:

#include <stdio.h>

int main(){

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

    return 0;
}

このプログラムの興味深い点は、コンパイルしてC89モードで実行すると、C89そして、コンパイルされてC99モードで実行されると、C99。しかし、このプログラムがどのように機能するかを理解することはできません。

上記のプログラムでprintfの2番目の引数がどのように機能するか説明できますか?

124
Spikatrix

C99では//スタイルのコメント、C89はそうではありません。したがって、翻訳するには:

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 */
132
Paul Rubel

行コメント//はC99から導入されました。したがって、C89のコードはこれに等しくなります

#include <stdio.h>

int main(){

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

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

c99ではこれと同等

#include <stdio.h>

int main(){

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

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

なぜなら//コメントはC99以降の標準にのみ存在し、コードは以下と同等です。

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

正しいコードは次のとおりです。

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