【问题标题】:Is there a diffrence between time_t now=time(NULL); and time_t now; time(&now);?time_t now=time(NULL); 之间有区别吗?和 time_t 现在;现在的时间);?
【发布时间】:2017-08-04 20:11:31
【问题描述】:

两者都在我的简单测试代码中正常工作,但我想知道是否有任何真正的区别,或者在编码风格方面是否有任何一致同意的偏好。

附上示例代码:

#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's answer - 这个问题可能应该被标记为重复。

【问题讨论】:

  • 注意:time_t 未定义为long,因此使用"%ld" 打印不可移植。 printf("now1 = %ld\n", (long) now1); 稍微好一些。考虑printf("now1 = %s\n", ctime(&amp;now1)); 或其他人。

标签: c time time.h time-t


【解决方案1】:

两者没有区别。

如果你这样做:

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

now1now2 将具有相同的值。

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

【讨论】:

    【解决方案2】:

    作为考虑性能的旁注:如果您使用带有 NULL 参数值的那个,编译器将生成不同的代码(很可能它会 xor 输出传入参数(通常是寄存器)),而不是使用参数(其中生成的代码将包含对实际地址的传入参数的赋值),并且由于无论参数值如何,函数都将返回时间值,如果有(有效)地址作为参数执行可能会多花几个周期,因为在函数内部,检查是否将返回值复制到给定地址,如果有地址(即:参数不为空),将执行内存复制.

    【讨论】:

      【解决方案3】:

      如果有任何真正的区别?

      差别不大。

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

      未显示的是time_t now3 = time(NULL);,它遵循RAII 的流行风格,因为该对象在没有定义值的情况下永远不会存在 - 这是 OP 的 2 个示例中的一个缺点。

      或任何约定的编码风格偏好?

      我更喜欢第 3 种方式,但最好使用您所在小组的编码标准中概述的样式。如果您的团队缺乏标准,请制定标准,因为以类似的一致风格进行编码更有价值。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 你有这个参考吗?我不知道,想了解更多。
        • @Storyteller,我检查了我 1978 年的 K&R 版本,甚至那个版本也允许双打回归。所以我在一般情况下是错误的,应该参考time函数的历史,在某个地方就是这种情况......
        • @StoryTeller,即使是 PDP-11 C 也有返回类型 double。
        • 依稀记得类似的事情,所以才问。但实际上,C 标准提供了一种抽象。即使大于int 的东西不能“返回”,也需要由实现来正确设置它(传递临时地址将保存结果)。从C代码来看,还是一个返回值的函数。
        • "任何大于 int 的东西都不能作为函数返回" --> 我确信 double sqrt(double) 是一个很好的反例。
        猜你喜欢
        • 2023-03-18
        • 2012-06-06
        • 1970-01-01
        • 2015-05-19
        • 2012-03-31
        • 2012-08-27
        • 1970-01-01
        • 2023-03-27
        • 2011-11-17
        相关资源
        最近更新 更多