Какая программа на С ведет себя по-разному во время выполнения при компиляции с C89 и C99? - PullRequest
14 голосов
/ 17 ноября 2011

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 17 ноября 2011

Эта программа напечатает 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;
}
3 голосов
/ 17 ноября 2011

Два примера:

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

  • C99 имеет -1<<1 в качестве неопределенного поведения (но не C89).

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

2 голосов
/ 17 ноября 2011

Целочисленное деление может дать другой результат, в зависимости от того, какую реализацию c89 вы использовали.

В ANSI C или ISO C указано, каким должно быть значение -5% 10?

...