time_t now=time(NULL); 和 time_t now; time(&now); 之间有什么区别吗?

4

这两种方法都在我的简单测试代码中正常工作,但我想知道是否存在任何真正的区别或任何编程风格上的约定偏好。

附带示例代码:

#include <stdio.h>
#include <time.h>

int main(int argc, char **argv)
{
    time_t now1, now2;
    time(&now1);
    now2 = time(NULL);

    printf("now1 = %ld\n", now1);
    printf("now2 = %ld\n", now2);

    return 0;
}

编辑
我刚刚看到Keith Thompson的回答 - 这个问题可能应该标记为重复。


1
注意:time_t未定义为long,因此使用"%ld"打印不具有可移植性。 printf("now1 = %ld\n", (long) now1);稍微好一些。考虑使用printf("now1 = %s\n", ctime(&now1));或其他方法。 - chux - Reinstate Monica
4个回答

1
作为性能的一个侧面说明:如果您使用带有NULL参数值的函数,则编译器将生成不同的代码(最可能是将传入参数(通常是寄存器)xor掉),而对于带参数的情况(代码生成将包含实际地址的传入参数的赋值),并且由于无论参数值如何,函数都将返回时间值,因此如果参数是(有效)地址,则执行可能需要更多的周期,因为在函数内部,有一个检查是否将返回值复制到给定地址的过程,如果存在地址(即参数不为空),则会执行内存复制。

1

这两者之间没有区别。

如果你这样做:

time_t now1, now2;
now2 = time(&now1);

现在,now1now2将具有相同的值。

历史记录上,如果在Linux 2.4或更早版本的64位内核上运行,则这些值将不会相同。 time函数中存在一个错误,只设置传入参数的低32位(当time_t为64位时)。因此,如果您使用返回值,则会得到正确的值,但是如果您传递未初始化变量的time_t地址,则会得到垃圾值。


1

是否有任何实际区别?

没有太大的区别。

time_t now1, now2;
time(&now1);
now2 = time(NULL);

未显示的是time_t now3 = time(NULL);,这遵循了RAII的一种流行风格,在这种风格中,对象没有定义的值就不存在-这是OP两个例子中的一个缺点。

或者在编程风格上达成共识?

我更喜欢这第三种方法,但最好使用你的团队编码标准中概述的样式。如果你的团队缺乏标准,请制定它们,因为以类似统一的风格编码更有价值。


0

没有什么区别。过去,任何大于 int 的东西都不能作为函数返回,因此接收变量必须作为指针传递。


1
你有这方面的参考资料吗?我不知道这个,想要了解更多。 - StoryTeller - Unslander Monica
1
@Storyteller,我查看了我的1978年版K&R,即使那个版本也允许返回双精度。因此,在一般情况下,我是错误的,应该参考time函数的历史记录,在某些情况下这是正确的... - Paul Ogilvie
@StoryTeller,即使是PDP-11 C语言也有返回类型double。 - Paul Ogilvie
我依稀记得有这样的事情,所以才问了。但实际上,C标准提供了一种抽象。即使返回值比int更大,也可以通过传递将保存结果的临时变量的地址来正确设置它(即传递指向结果的指针)。从C代码的角度来看,它仍然是一个返回值的函数。 - StoryTeller - Unslander Monica
“anything larger than int could not be returned as a function return” --> 我确信 double sqrt(double) 是一个很好的反例。 - chux - Reinstate Monica
请参考Keith Thompson在https://dev59.com/amkw5IYBdhLWcg3wXpac中的答案。我还阅读了更多关于C语言从B语言演变的历史,B语言只有char、int和指针数据类型(16位PDP11),16位无法容纳时间值,因此那些库的`time`函数不能返回时间值,必须使用指针。现在`time`被定义为使用指针,它被定义为永久使用? - Paul Ogilvie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接