plus - ¿Por qué la función time(time_t*) regresa y establece el by-ref?
time_t cplusplus (2)
No hay un beneficio real en la forma en que se define actualmente.
Sospecho que cuando la función time()
se definió por primera vez, usó un tipo que no se pudo devolver desde una función. Las implementaciones muy tempranas de C no tenían long int
y no podían devolver estructuras de las funciones. En un sistema con ints de 16 bits, la única forma de representar un tiempo sería como una estructura o como una matriz; 16 bits por valor de segundos es menos de un día.
Por lo tanto, las implementaciones tempranas de time()
podrían haber usado de esta forma (especulación):
time_t now;
time(&now); /* sets now.time_high, now.time_low */
o quizás:
int now[2];
time_t(now); /* sets now[0], now[1] */
Cuando las implementaciones posteriores de C agregaron enteros más largos y la capacidad de devolver estructuras por valor, se agregó la capacidad de devolver un valor time_t
desde la función time()
, pero la funcionalidad anterior se mantuvo para evitar romper el código existente.
Creo que si el time()
estuviera siendo definido hoy, se vería más como esto:
time_t time(void);
No he podido confirmar que las implementaciones antiguas de la función time()
funcionaron de esta manera (¡intente en Google "tiempo"!), Pero tiene sentido dada la historia del idioma.
Si pasa un puntero nulo a la función time()
, devuelve la hora actual sin almacenarla en una variable; esto evita algunas de las penalizaciones de rendimiento:
time_t now = time(NULL);
Siempre he tenido curiosidad, ¿por qué la función time(time_t *)
devuelve un time_t
y establece la hora en el puntero pasado?
Ejemplo de devolución del tiempo:
time_t myTime = time(NULL);
printf("The time is now %s", ctime(&myTime));
Ejemplo de ajuste del valor al puntero:
time_t myTime;
time(&myTime);
printf("The time is now %s", ctime(&myTime));
Originalmente, pensé que habría una ganancia de rendimiento al escribir en la memoria en lugar de volver, pero si tiene que hacer ambas cosas, ¿no es eso solo un poco más lento?
Te permite anidar una llamada a time()
dentro de otra expresión, en lugar de hacerlo en una declaración separada:
time_t x = time(&now) + more_time;
Cuando la declaración anterior termine, now
debería contener la hora actual, x
debería contener la hora actual más algún valor.
strcpy
cae en el mismo caso porque devuelve el mismo puntero char *
que se ha pasado como su destino, por lo que también es posible anidar:
printf("Copied string is %s", strcpy(dst, src));