首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解ctime代码

理解ctime代码
EN

Stack Overflow用户
提问于 2014-12-26 16:07:50
回答 2查看 323关注 0票数 0

我是新来的C,还在努力了解它是如何工作的,任何帮助都是非常感谢的。我正在研究一个代码示例,该示例在用户屏幕上打印当前本地时间。我对代码进行了注释,以帮助我理解正在发生的事情,并对它的工作方式提出了疑问;

代码语言:javascript
复制
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main()
        {
        //define timeval as data type time_t
        time_t timeval;

        //Apply the time function, found in time.h, and use timeval as parameter
        (void)time(&timeval);

        //Use ctime, found in time.h, and use timeval as parameter
        printf("The date is: %s", ctime(&timeval));
        exit(0);
        }

首先,我不清楚(void)time(&timeval)到底是如何工作的,特别是因为删除(void)似乎并没有破坏程序的运行方式。从阅读的角度来看,我的理解是,当函数没有返回任何内容时,就会使用void,但是为什么这很重要呢?不知道为什么要用它。此外,timeval的数据类型在程序开始时被声明为time_t,但是在以后ctime函数使用它时,时间函数使用它做了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-26 17:23:51

返回值的函数通常是出于某种目的。在本例中,time()返回当前成功时间的表示,但如果由于某种原因无法获得当前时间,也返回-1

您的代码不检查此返回值,而且要保持健壮,应该这样做,因为如果对time()的调用失败,则需要更改将失败的结果传递给ctime()的计划。

一些静态分析工具,特别是lint或其现代对应的夹板,将(或可能被告知)在调用一个函数时标记一个问题,而该函数的返回值正是出于这个原因--因为该函数提供了您忽略的潜在有用信息。

在语义上,将返回值转换为(void)是一种在代码中声明您正在显式放弃该值的方法。可以说,这本身就有一些优点,代价是代码杂乱无章,但特别是它可以用来压制其中的一些警告,因为您是在告诉分析工具您是故意这样做的,因此它不需要警告您。

在这种情况下,time()还将它返回的值存储在指定为其参数的变量中,因此您有两种不同的方法来获得它。在这里将返回转换为(void)可能是这样一种说法:“我故意通过它的参数获得time()的输出,并且我显式地放弃了返回值,因为我只需要该输出一次,而且我已经拥有它了。”它实际上并没有改变代码所做的事情,但它是一种在代码中明确说明您正在做什么的方法。如果您习惯于通过time()的返回值从它获得输出,并且在这种特殊情况下,您选择通过参数获取它,那么添加强制转换可能会帮助您稍后记住您做了什么,以防您的第一反应是想知道为什么要调用time(),而且显然没有存储结果。

不管你怎么做,你还是应该检查是否失败。例如,尽管您可以执行如下操作:

代码语言:javascript
复制
time_t timeval;
time(&timeval);
if ( timeval == -1 ) {
    fprintf(stderr, "couldn't get time");
    return EXIT_FAILURE;
}
printf("The date is: %s", ctime(&timeval));

这样做可能更自然:

代码语言:javascript
复制
time_t timeval;
if ( time(&timeval) == -1 ) {
    fprintf(stderr, "couldn't get time");
    return EXIT_FAILURE;
}
printf("The date is: %s", ctime(&timeval));

这就是知道您没有使用返回值的地方,即使您是通过参数获得结果的。

缺点是,有一些函数确实返回了一个值,而这个值通常对检查并不有用,printf()就是一个明显的例子。如果您使用了大量这些函数,那么您的代码很快就会被无用的(void)转换弄得乱七八糟,尽管意图良好,但这种技术更容易分散注意力,而不是带来好处。

票数 3
EN

Stack Overflow用户

发布于 2014-12-26 17:24:23

如果不使用返回值,则不必转换为(void)。也许有一些奇怪的编译器会抱怨如果您不进行强制转换(例如,“返回值未使用”),但我对此表示怀疑。通常,如果您打算使用返回值,它将间接显示为未初始化的变量警告。

当您通过引用timeval函数传递time时,它将被设置为当前的系统时间。这相当于执行timeval = time(NULL)

time的行为

函数返回这个值,如果参数不是空指针,它还将这个值设置为timer指向的对象。

然后将其传递给ctime,将其转换为要打印的字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27659303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档