下面的程序如何在C89模式下编译时输出“C89”,编译为C99模式时如何输出“C99”?

我从网上find了这个C程序:

#include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5//**/ -4.5))); return 0; } 

这个程序的有趣之处在于,它在C89模式下编译和运行时,会打印C89 ,当它编译并运行在C99模式下时,将打印C99 。 但我无法弄清楚这个程序是如何工作的。

你能解释一下printf的第二个参数在上面的程序中是如何工作的吗?

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 */ 

行注释//是从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*/ 

由于//注释仅存在于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; }