使用C89和C99编译时,C程序在运行时的行为有何不同?

时间:2011-11-17 05:58:30

标签: c language-lawyer c99 c89

我发现以下代码片段(我认为在维基百科中)会在识别C ++注释时创建不同的运行时:

int a = 4 //* This is a comment, but where does it end? */ 2
  ;

但直到现在,这是唯一一个(不包括变体)。

我对使用__STDC__等进行区分并不感兴趣,而不是C89无法编译的程序。

是否有其他程序/片段与C99产生不同的运行时间?

3 个答案:

答案 0 :(得分:6)

该程序将在符合要求的C99实现上打印0.000000,在符合C99的实现上打印1.000000

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double d = strtod("0x1", NULL);
    printf("%f\n", d);
    return 0;
}

答案 1 :(得分:3)

两个例子:

  • C99的-3/2为定义行为(即截断为零)。

  • C99的-1<<1为未定义行为(但不是C89)。

另外,在过去我遇到了64位枚举的问题,例如enum {mask = 1ULL << 32},但我不记得编译器是静音,还是只是悄悄做错了。

答案 2 :(得分:2)

整数除法可以产生不同的结果,具体取决于您使用的c89实现。

Does either ANSI C or ISO C specify what -5 % 10 should be?