printf上错误的clock_t输出值

时间:2018-02-13 15:26:54

标签: c time.h

我有以下代码:

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

clock_t a;

void f(void) {
    a = clock();
    printf("in f(): %g\n", a);
}

void main(void) {
    f();
    printf("in main(): %g\n", a);
}

使用MinGW gcc进行编译并运行它会产生类似于此的输出:

in f(): -1.#QNAN
in main(): 1.49845e-307

问题:为什么a包含-1.#QNAN?虽然我理解what it means,但我没有看到代码中出现了什么问题。起初,我推测它与类型clock_t的打印格式说明符有关,但this stackoverflow thread的答案则另有说明。即使为了确保,我在标准标题中进行了快速挖掘,发现clock_tlong的typedef(至少在我的机器上),这意味着没有任何问题。显示值。它可能是clock()函数中的错误吗?

编辑:在阅读完评论之后,我意识到我的实际问题是我希望a成为一些超小的浮点值,以至于我忘了{{正如我所说,1}}在我的机器上定义为类型clock_t。很抱歉打扰你,感谢大家的时间。

2 个答案:

答案 0 :(得分:2)

请始终查看您的编译器警告:

warning: format specifies type 'double' but the argument has type
      'clock_t' (aka 'unsigned long') [-Wformat]
    printf("in f(): %g\n", a);
                    ~~     ^
                    %lu

编译器甚至会告诉您如何修复。简而言之,当数据为double时,您无法指定printf()unsigned long

答案 1 :(得分:2)

%g用于打印浮点数,但是您传递了clock_t(可以是任何算术类型;例如32位整数)。

如果您想使用double

,则需要投放到%g
printf("in main(): %g\n", static_cast<double>(a));