Как работает приведение time_t в C? - PullRequest
0 голосов
/ 20 ноября 2018

Пожалуйста, рассмотрите следующую программу:

#include <stdio.h>
#include <time.h>
#define N 10000
int main ()
{
    time_t begin1,end1;
    float diff1;
    int begin2, end2, diff2;
    int i;

    begin1 = time (NULL);
    begin2 = time (NULL);

    //consuming time
    for(i=0;i<N;i++){
        printf("%.2f%%\n",(i/(float)N)*100);
    }

    end1 = time (NULL);
    end2 = time (NULL);

    diff1 = difftime(end1, begin1);
    diff2 = end2-begin2;

    printf("%f\t%d\n",diff1, diff2);
    return 0;
}

Мы видим, что программа работает отлично.Он рассчитывает разницу во времени двумя способами.И оба дают одинаковый ответ.Мне интересно, почему возможно неявное преобразование результата вызова time(NULL) в целочисленную переменную таким образом.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Мне интересно, почему возможно неявное преобразование результата времени вызова (NULL) в целочисленную переменную таким образом.

Нет, не для переносимого надежного кода иполучить согласованные ожидаемые результаты.

  1. difftime() возвращает double.Сохранение как float может, конечно, потерять дальность и точность.Возвращает разницу в секундах .

    // float diff1;
    double diff1 = difftime(end1, begin1);
    
  2. time_t тип скаляр .Обычно это какое-то широкое целое число и обычно целое число со знаком.Все же это не должно быть.Сохранение в формате int может привести к потере диапазона (не редкость) и точности, если time_t был некоторый тип с плавающей точкой (редко).time_t часто масштабируется в секундах, но это не требуется для C. Возможны другие единицы.

    // int begin2 = time (NULL);
    time_t begin2 = time (NULL);
    ...
    // int end2 = time (NULL);
    time_t end2 = time (NULL);
    
    printf("%f\n",difftime(end2, begin2));
    

Как работает приведение time_t вC?

Деталь.Пост ОП не кастует ничего, кроме go (float)N.Код присваивает time_t int и вызывает преобразование.Это похоже на кастинг.

0 голосов
/ 20 ноября 2018

Во-первых, проверьте прототип time () :

time_t time (time_t* timer);

, где вы можете видеть, что тип возвращаемого значения time_t, который обычно реализован какдлинное целое число .

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

Подробнее в Что такоев конечном итоге type_f type_f определяется как?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...