Что программа C ведет себя по-разному во время выполнения при компиляции с C89 и C99?

Я нашел следующий фрагмент (я думаю, в Википедии), который создает другое время выполнения, когда комментарии С++ распознаются, чем когда нет:

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

Но до сих пор это был единственный (варианты исключены).

Мне не интересно различать, используя __STDC__ и тому подобное, а не в программах, которые C89 не будет компилировать.

Существуют ли другие программы/фрагменты, производящие другое время выполнения с C89, чем C99?

Ответы

Ответ 1

Эта программа будет печатать 0.000000 в соответствии с реализацией C89 и 1.000000 в соответствии с реализацией C99:

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

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

Ответ 2

Два примера:

  • C99 имеет -3/2 как заданное поведение (а именно, обрезание до нуля).

  • C99 имеет -1<<1 как Undefined Поведение (но не C89).

Кроме того, в прошлом я столкнулся с проблемами с 64-разрядными перечислениями, такими как enum {mask = 1ULL << 32}, но я не помню, был ли компилятор молчал или просто сделал не так.