в чем разница между difftime и '-'?

У меня есть 2 переменные типа time_t — varEnd и varStart. Теперь для того, чтобы увидеть разницу между ними Либо я могу сделать

varEnd - varStart; 

or

difftime(varEnd, varStart);

и оба возвращают количество секунд.

Подскажите, пожалуйста, есть ли у них разница? или какой рекомендуемый?


person Naresh    schedule 13.12.2012    source источник
comment
Почему это помечено как C++ ?   -  person Paul R    schedule 13.12.2012
comment
@PaulR: difftime() существует как в C, так и в C++.   -  person Keith Thompson    schedule 13.12.2012
comment
Ну, вы, вероятно, также можете назвать это Паскалем или Фортраном, но это не делает этот вопрос Паскалем или Фортраном. ;)   -  person Paul R    schedule 13.12.2012
comment
Возможно, нам следует добавить больше тегов, если функцию можно напрямую вызывать из многих других языков и относиться к этому сообществу, а не удалять их, потому что это увеличивает вероятность поиска и помогает этому сообществу.   -  person Naresh    schedule 18.12.2012


Ответы (2)


Язык определяет, что time_t — это арифметический тип, способный представлять время. Это не требует, чтобы он представлял время каким-либо особым образом.

Если time_t представляет время как количество секунд, прошедших с некоторого момента, оператор - правильно вычислит разницу в секундах между двумя значениями time_t.

Если это не так (скажем, если гранулярность составляет одну миллисекунду или если биты time_t разделены на группы, представляющие годы, месяцы, дни и т. д.), то оператор - может дать бессмысленные результаты.

С другой стороны, функция difftime() "знает", как time_t представляет время и использует эту информацию для вычисления разницы в секундах.

В большинстве реализаций простое вычитание и difftime() делают одно и то же, но только difftime() гарантированно работает правильно во всех реализациях.

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

person Keith Thompson    schedule 13.12.2012

difftime() возвращает двойное число с плавающей запятой, простое вычитание их не даст результата, если вы сначала не приведете их к двойному значению.
источник: здесь

person Kevin    schedule 13.12.2012
comment
Да, но даже преобразование обоих операндов time_t в double перед их вычитанием не гарантирует того же результата, что и difftime, поэтому и существует difftime. Смотрите мой ответ. - person Keith Thompson; 29.08.2013