web-dev-qa-db-fra.com

Quel est le temps (NULL) en C?

Je découvre certaines fonctions de base du C et ai rencontré time(NULL) dans certains manuels.

Qu'est-ce que cela veut dire exactement?

47
dmubu

Vous pouvez passer un pointeur sur un objet time_t que time remplira avec l'heure actuelle (et la valeur renvoyée est identique à celle que vous avez indiquée). Si vous passez NULL, il l'ignore et renvoie simplement un nouvel objet time_t qui représente l'heure actuelle.

41
jason

L'appel à time(NULL) renvoie l'heure actuelle du calendrier (en secondes depuis le 1er janvier 1970). Voir cette référence pour plus de détails. Habituellement, si vous passez un pointeur sur une time_tvariable , cette variable de pointeur indiquera l'heure actuelle.

27
jonsca

[Réponse copiée à partir d'un dupliquer, question maintenant supprimée .]

time() est une très, très ancienne fonction. Cela remonte à un jour où le langage C n'avait même pas le type long. Il était une fois, le seul moyen d'obtenir quelque chose comme un type 32 bits était d'utiliser un tableau de deux ints - et c'était à ce moment-là que ints avait une résolution de 16 bits.

Alors vous avez appelé

int now[2];
time(now);

et il remplit l'heure 32 bits dans now[0] et now[1], 16 bits à la fois. (Cela explique pourquoi les autres fonctions liées au temps, telles que localtime et ctime, tendent également à accepter leurs arguments de temps via des pointeurs.)

Plus tard, dmr a fini d’ajouter long au compilateur, vous pouvez donc commencer à dire

long now;
time(&now);

Plus tard encore, quelqu'un a compris qu'il serait utile que time() poursuive et renvoie la valeur, plutôt que de la renseigner via un pointeur. Mais - la compatibilité en amont est une chose merveilleuse - au profit de tout le code qui fonctionnait encore time(&now), la fonction time() devait continuer à supporter l'argument pointeur. C'est pourquoi - et c'est pourquoi la compatibilité en amont n'est pas toujours une chose merveilleuse - si vous utilisez la valeur de retour, vous devez toujours transmettre NULL en tant que pointeur:

long now = time(NULL);

(Plus tard encore, bien sûr, nous avons commencé à utiliser time_t au lieu de plain long pour les heures, de sorte que, par exemple, il puisse être modifié en un type 64 bits, en évitant le problème y2.038k .)

[P.S. En fait, je ne suis pas sûr que le passage de int [2] à long et l'ajout de la valeur de retour se soient produits à des moments différents; ils pourraient avoir eu lieu en même temps. Mais notez que lorsque l'heure était représentée sous la forme d'un tableau, elle {avait} à remplir via un pointeur, elle ne peut pas être renvoyée sous forme de valeur car, bien entendu, les fonctions C ne peuvent pas renvoyer de tableaux.

11
Steve Summit

La fonction time renvoie l’heure actuelle (en tant que valeur time_t) en secondes depuis un certain point (sur les systèmes Unix, à partir de minuit UTC le 1er janvier 1970) et prend un argument, un pointeur time_t dans lequel l’heure est stockée. Si vous passez NULL en tant qu’argument, time renvoie l’heure en tant que valeur de retour normale, mais ne la stocke nulle part ailleurs.

3
jwodder

Time: Renvoie le temps écoulé en secondes depuis l'époque 1 janvier 1970

3
Mob
int main (void)
{   
    //print time in seconds from 1 Jan 1970 using c   
    float n = time(NULL);   
    printf("%.2f\n" , n);      
}      

ceci imprime 1481986944.00 (en ce moment).

2
k_clark.90

Vous devez vous référer à la documentation pour ctime . time est une fonction qui prend un paramètre de type time_t * (un pointeur sur un objet time_t) et lui attribue l'heure actuelle. Au lieu de passer ce pointeur, vous pouvez également transmettre NULL, puis utiliser la valeur time_t renvoyée.

1
Mahmoud Al-Qudsi

Vous pouvez passer un pointeur sur un objet time_t que l'heure se remplira avec l'heure actuelle (et la valeur renvoyée est la même que celle que vous avez indiquée). Si vous passez NULL, il l'ignore et renvoie simplement un nouvel objet time_t qui représente l'heure actuelle.

Nb:time(&timer); est équivalent à timer = time(NULL);

0