下面的程序如何在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; }