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


128

我从网上找到了这个C程序:

#include <stdio.h>

int main(){

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

    return 0;
}

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

您能否解释printf上述程序中第二个参数的工作方式?


47
提示://C99 风格的注释是在C99中引入的。
Paul R

4
不错的窍门-但失败了gcc。如果没有std=c99,你会得到一个警告,如果你忽视它,gcc仍然解释//为注释的开始(啊-你必须使用-pedantic,以及我有一个默认。)
usr2564301

3
@Jongware好吧,我在gcc 4.9.2中获得C89了显式的支持std=c89
ikh

60
以防万一有人在寻找测试C99支持的方法时发现了这一点;请使用类似之类的东西#if __STDC_VERSION__ >= 199901L,而不是//注释技巧。=)
Arkku

10
它还为C11打印“ C99” ...
伦丁,2015年

Answers:


133

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

25

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

9

因为//注释仅在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;
}

您的答案中出现一个错误,当应该打印89时,如何得到90?
Pimgd

1
@Pimgd C89和C90是同一件事。stackoverflow.com/questions/17206568/…–
Lundin

3
它们的含义相同,但字符串不同。站在我原来的问题旁边。
Pimgd

@Pimgd上面代码的目的不是为了完成某些给定格式的字符串打印任务。目的是演示IOCCC之外的实词应用程序如何打印该程序使用的C版本。C90比“ C89”或“ ANSI-C”更正确地使用。
伦丁2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.