2012-03-30 14 views
16

Zawsze byłem ciekawy, dlaczego funkcja time(time_t *) zwraca zarówno time_t, i ustawić czas na przekazany wskaźnik?Dlaczego czas (time_t *) działa zarówno wracać, jak i ustawiać wartość -dec?

Przykład powrocie czas:

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

Przykład ustawienia wartości wskaźnika:

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

I początkowo myślałem że będzie to wzrost wydajności poprzez pisanie do pamięci zamiast wrócić , ale jeśli musi to robić jedno, czy nie powoduje to spowolnienia?

Odpowiedz

16

Nie ma realne korzyści w sposób aktualnie zdefiniowane .

Podejrzewam, że po pierwszym zdefiniowaniu funkcji time() użył on typu, którego nie można zwrócić z funkcji. Bardzo wczesne implementacje C nie miały long int i nie były w stanie zwrócić struktur z funkcji. W systemie z 16-bitowymi intami jedyny sposób reprezentowania czasu byłby strukturą lub tablicą; 16 bitów wartości sekund to mniej niż jeden dzień.

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

Albo::

tak wcześnie implementacje time() mogło być coś takiego (spekulacji) stosowany

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

Kiedy później implementacje C dodaje dłuższe całkowite i zdolność do powrotu struktur według wartości dodana została możliwość zwrócenia wartości time_t z funkcji time(), ale zachowano starą funkcjonalność, aby uniknąć złamania istniejącego kodu.

myślę, że jeśli time() były zdefiniowane dzisiaj, to będzie wyglądać mniej więcej tak:

time_t time(void); 

nie byłem w stanie potwierdzić, że stare implementacje funkcji time() pracował w ten sposób (spróbuj Googling " czas "!), ale ma sens biorąc pod uwagę historię tego języka.

Po przekazaniu zerowego wskaźnika do funkcji time(), zwraca bieżący czas bez zapisywania go w zmiennej; pozwala to uniknąć niektórych spadku wydajności:

time_t now = time(NULL); 
+0

To brzmi wiarygodnie. Spodziewałem się, że kara za wyniki pójdzie w drugą stronę. Unika się go, jeśli przekażemy wartość NULL, ale jeśli wywołamy go wskaźnikiem i zignorujemy wynik zwracany, to nadal musimy wrzucić ten czas do rejestru zwrotów. Czasami zapominam, że C jest prawie dwa razy starsza ode mnie. :) – wjl

+2

* Czasami zapominam, że C jest prawie dwa razy starszy ode mnie. * - Dzięki za sprawienie, że poczuję się stary! 8-)} –

7

To pozwala na gnieździe wezwanie do time() w innej wypowiedzi, zamiast robić to w osobnym oświadczeniu:

time_t x = time(&now) + more_time; 

Gdy powyższe wykończenia oświadczeniu now powinien zawierać aktualny czas i x powinien zawierać obecny czas plus pewna wartość.

strcpy spada w tej samej sprawie, ponieważ zwraca taką samą char * wskaźnik, który został przekazany jako miejsca przeznaczenia, więc zagnieżdżanie możliwe jest również:

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

Jeśli 'time()' wziął żadnych argumentów, które mogłyby być równie dobrze wykonywane przez zagnieżdżanie zadanie: 'time_t x = (teraz = time())' + more_time ; ' –

+3

Chociaż zgadzam się z Keithem, ta odpowiedź jest pierwszą, którą widziałem, aby zapewnić potencjalne wygodne użycie dla dziwnego podpisu' time' ... –

+0

Myślę, że w obu przypadkach lepiej byłoby użyć dwóch linii ze względu na czytelność. Prawdopodobnie kompiluje się do tego samego w obu kierunkach. – wjl

Powiązane problemy