Ответ 1
Язык указывает, что time_t
- это арифметический тип, способный представлять время. Он не требует, чтобы он представлял времена каким-либо определенным образом.
Если time_t
представляет время как количество секунд с некоторого момента, оператор -
будет правильно вычислять разницу в секундах между двумя значениями time_t
.
Если это не так (например, если гранулярность составляет одну миллисекунду или если биты a time_t
делятся на группы, представляющие годы, месяцы, дни и т.д.), то оператор -
может дать бессмысленные результаты.
Функция difftime()
, с другой стороны, "знает", как time_t
представляет время и использует эту информацию для вычислите разницу в секундах.
В большинстве реализаций простое вычитание и difftime()
выполняют одно и то же, но только difftime()
гарантированно работает правильно во всех реализациях.
Другое отличие: difftime()
возвращает результат типа с плавающей запятой double
, а "-"
на time_t
значения дает результат типа time_t
. В большинстве случаев результат будет неявно преобразован в тип того, что вы его назначили, но если time_t
является целым типом без знака, вычитание более позднего времени с более раннего времени даст очень большое значение, а не отрицательное значение. Каждая система, которую я видел, реализует time_t
как 32-битный или 64-разрядный целочисленный тип со знаком, но допускается использование беззнакового типа - еще одна причина, по которой простое вычитание значений time_t
не имеет смысла.