2012-03-30 11 views
16

Sono sempre stato curioso, perché la funzione time(time_t *) restituisce entrambi uno time_t e imposta l'ora sul puntatore passato?Perché la funzione time (time_t *) funziona sia per restituire che per impostare il riferimento?

Esempio di restituire il tempo:

time_t myTime = time(NULL); 
printf("The time is now %s", ctime(&myTime)); 

Esempio di impostazione del valore al puntatore:

time_t myTime; 
time(&myTime); 
printf("The time is now %s", ctime(&myTime)); 

Ho inizialmente pensato che ci sarebbe stato un guadagno di prestazioni scrivendo alla memoria invece di ritornare , ma se deve fare entrambe le cose, non lo rende solo più lento?

risposta

16

Non c'è alcun reale beneficio nel modo in cui è attualmente definito .

Sospetto che quando è stata definita la funzione time(), ha utilizzato un tipo che non è stato possibile restituire da una funzione. Le implementazioni C molto iniziali non avevano long int e non erano in grado di restituire strutture dalle funzioni. Su un sistema con intep da 16 bit, l'unico modo per rappresentare un tempo sarebbe come una struttura o come una matrice; 16 bit del valore di secondi è inferiore a un giorno.

così presto implementazioni di time() potrebbero essere stati utilizzati qualcosa di simile (speculazione):

time_t now; 
time(&now); /* sets now.time_high, now.time_low */ 

o forse:

int now[2]; 
time_t(now); /* sets now[0], now[1] */ 

Quando più tardi C implementazioni aggiunti interi più lungo e la capacità di restituire le strutture in base al valore, è stata aggiunta la possibilità di restituire un valore time() dalla funzione time(), ma è stata mantenuta la vecchia funzionalità per evitare di rompere il codice esistente.

Penso che se time() venivano definiti oggi, sarebbe un aspetto più simile a questo:

time_t time(void); 

non sono stato in grado di confermare che le vecchie implementazioni della funzione time() lavorato in questo modo (prova Googling " tempo "!), ma ha senso data la storia della lingua.

Se si passa un puntatore nullo alla funzione time(), restituisce l'ora corrente senza memorizzarla in una variabile; questo evita alcuni dei termini di prestazioni:

time_t now = time(NULL); 
+0

Sembra plausibile. Mi aspettavo che la penalità per le prestazioni andasse dall'altra parte. Viene evitato se si passa un NULL, ma se lo si chiama con un puntatore e si ignora il risultato di ritorno, è comunque necessario inserire il tempo nel registro di ritorno. A volte dimentico che C ha quasi il doppio di me. :) – wjl

+2

* A volte dimentico che C ha quasi il doppio di me. * - Grazie per avermi fatto sentire vecchio! 8-)} –

7

Esso consente di nido una chiamata a time() all'interno di un'altra espressione, invece di farlo in una dichiarazione separata:

time_t x = time(&now) + more_time; 

Al termine dichiarazione di cui sopra, now deve contenere l'ora corrente, e x dovrebbe contenere l'ora corrente più un valore.

strcpy cade nello stesso caso perché restituisce lo stesso puntatore char * che è stata passata come la sua destinazione, in modo nidificazione è anche possibile vedere:

printf("Copied string is %s", strcpy(dst, src)); 
+3

Se 'tempo()' preso senza argomenti, che potrebbe facilmente essere fatto da nidificazione un incarico: 'time_t x = (now = time())' + more_time ; ' –

+3

Mentre sono d'accordo con Keith, questa risposta è la prima che ho visto per fornire un potenziale utilizzo conveniente per la firma dispari di' time' ... –

+0

Penso che in entrambi i casi sarebbe meglio usare due linee per motivi di leggibilità. Probabilmente si adatta alla stessa cosa in ogni caso. – wjl

Problemi correlati