Что программа 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}
, но я не помню, был ли компилятор молчал или просто сделал не так.
Ответ 3
Целочисленное деление может дать другой результат, в зависимости от используемой вами реализации c89.
Указывает ли в ANSI C или ISO C, что -5% 10?