为什么time(time_t*)函数都返回并设置by-ref?

wjl*_*wjl 16 c time libc

我一直很好奇,为什么time(time_t *)函数都返回一个time_t,并设置传入指针的时间?

返回时间的示例:

time_t myTime = time(NULL);
printf("The time is now %s", ctime(&myTime));
Run Code Online (Sandbox Code Playgroud)

将值设置为指针的示例:

time_t myTime;
time(&myTime);
printf("The time is now %s", ctime(&myTime));
Run Code Online (Sandbox Code Playgroud)

我原本以为通过写入内存而不是返回会有性能提升,但是如果它必须同时执行这两种操作,那是不是只会让它变慢?

Kei*_*son 16

它目前定义的方式没有任何实际好处.

我怀疑当time()首次定义函数时,它使用了一个无法从函数返回的类型.非常早期的C实现没有long int并且无法从函数返回结构.在具有16位整数的系统上,表示时间的唯一方法是作为结构或数组; 16位的秒数不到一天.

所以早期的实现time()可能已经使用了这样的东西(推测):

time_t now;
time(&now);    /* sets now.time_high, now.time_low */
Run Code Online (Sandbox Code Playgroud)

也许:

int now[2];
time_t(now);    /* sets now[0], now[1] */
Run Code Online (Sandbox Code Playgroud)

当后来的C实现添加更长的整数和按值返回结构的能力时,添加了time_ttime()函数返回值的能力,但保留旧功能以避免破坏现有代码.

我认为如果time()今天被定义,它看起来会更像这样:

time_t time(void);
Run Code Online (Sandbox Code Playgroud)

我无法确认time()函数的旧实现是否以这种方式工作(尝试使用Google搜索"时间"!),但考虑到语言的历史,它是有意义的.

如果将空指针传递给time()函数,它将返回当前时间而不将其存储在变量中; 这避免了一些性能损失:

time_t now = time(NULL);
Run Code Online (Sandbox Code Playgroud)

  • *有时我会忘记C几乎是我的两倍.* - 感谢你让我觉得老了!8-)} (2认同)

Bla*_*iev 7

它允许您将调用嵌套到time()另一个表达式中,而不是在单独的语句中执行:

time_t x = time(&now) + more_time;
Run Code Online (Sandbox Code Playgroud)

当上述语句结束时,now应该包含当前时间,并且x应该包含当前时间加上一些值.

strcpy落在相同的情况下,因为它返回char *已作为目标传递的相同指针,因此嵌套它也是可能的:

printf("Copied string is %s", strcpy(dst, src));
Run Code Online (Sandbox Code Playgroud)

  • 如果`time()`没有参数,可以通过嵌套赋值来轻松完成:`time_t x =(now = time())`+ more_time;` (3认同)
  • 虽然我同意基思的观点,但这个答案是我第一次为"时间"奇怪的签名提供了一个潜在的方便用法...... (3认同)
  • 我认为在这两种情况下,为了可读性,最好使用两行。无论哪种方式,它都可能编译为相同的东西。 (2认同)