已搜索此问题的答案,但什么也找不到。我能找到的最接近的是difftime returning 0 when there is clearly a difference,它有一个很好的解释,关于参数是如何推送到堆栈上的,以及格式需要什么,但我认为我的问题是不同的:
我已经做了一个尽可能简单的例子。假设我用C语言编写了以下代码:
time_t starttime = time(NULL)
somefunction();
time_t newtime = time(NULL)
fprintf(stderr, "starttime %f and difftime %f\n", starttime, difftime(newtime, starttime));
fprintf(stderr, "difftime %f and starttime %f\n", difftime(newtime, starttime), starttime);
return 0;而某些函数是指运行1到2秒的函数。我得到的输出是:
starttime 2.000000 and difftime 0.000000
difftime 2.000000 and starttime 0.000000我甚至不知道从哪里开始我的问题。为什么当我交换顺序时,输出值仍然是一样的?此外,为什么其中一个值是0?无论我使用%f,%d,%lu,%llu等,这都是一样的。有堆栈参数的解释吗?fprintf到底在内部做什么?
谢谢。我已经浪费了太多的时间来调试它,我真的很感谢你的帮助!
发布于 2011-12-10 20:33:15
starttime是一个time_t,但是您要用%f打印它,它需要一个double。显然,在您的平台上,time_t是某种整数类型。
很可能,您的平台的变量参数列表函数(如fprintf() )的调用约定在与整数参数不同的位置传递浮点参数。
difftime()函数可能返回2.0,它是在第一个浮点参数位置传递的,这就是为什么第一个%f在两种情况下都会输出2.0的原因。第二个浮点参数位置似乎包含一个零,因此第二个%f在两种情况下都输出一个零。fprintf()代码根本不会检查time_t参数所在的位置。
发布于 2011-12-10 20:10:37
"%f"说明符不适合您平台上的time_t。据我所知,time_t类型可以是整型,也可以是实型。
例如,the POSIX standard只说:
time_t和clock_t应为整数或实数浮点类型。
试试这个:
/* Flawed bad and wrong. */
printf("%f\n", (double)starttime);我已经看到了将其转换为uintmax_t、unsigned long long等的建议。显然,真正的答案是here
没有统一的方法来打印time_t,句号。您不应该这样做-您甚至不需要在内部知道什么是time_t。建议的替代方法包括ctime()和strftime()。请使用这些来保持代码的可移植性。
https://stackoverflow.com/questions/8456382
复制相似问题