2014-09-30 55 views
0

我想要在我的C程序中获得一些基本的时间。 基本上我想在规定的时间内每秒翻几次。 我的问题是师似乎不能正确使用变量的 clock_t类型。clock_t除法结果为0

下面是一个最小的程序,它说明了什么问题,我都 GCC和铛测试它:

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

#define CLOCKS_PER_BLINK CLOCKS_PER_SEC/4L 

int main() { 
    printf("%li\n", CLOCKS_PER_SEC); 
    printf("%li\n", CLOCKS_PER_BLINK); 
    printf("%li\n", 4L); 
    printf("%li\n", CLOCKS_PER_SEC/CLOCKS_PER_BLINK); 
} 

这里是输出:

$ ./a.out 
1000000 
250000 
4 
0 

我本来期望在最后行返回4

+0

注意:'CLOCKS_PER_SEC'不一定是'long'。它是'clock_t'类型,可以是'int','double',...'printf(“%li \ n”,(long)CLOCKS_PER_SEC);''或'printf(“%lli \ n”,(long长)CLOCKS_PER_SEC);'更好。 – chux 2014-09-30 18:04:31

回答

2

CLOCKS_PER_SEC/CLOCKS_PER_BLINK宏评估/编译为:CLOCKS_PER_SEC/CLOCKS_PER_SEC/4L,运行时给出1/4,由于整数除法得出0。

需要在此括号按预期工作:CLOCKS_PER_SEC/(CLOCKS_PER_BLINK),或ALK建议,调整使用括号中的宏:#define CLOCKS_PER_BLINK (CLOCKS_PER_SEC/4L)

这里的问题是,宏评估极其夸张地说,这就是为什么你不应该做一些事情,比如在其中放入分号。他们基本上是找到并替换或copypasta,所以在他们周围额外小心是很好的。

+2

更好地将宏括号应用于宏:'#define CLOCKS_PER_BLINK(CLOCKS_PER_SEC/4L)'! – alk 2014-09-30 16:05:25

+1

将宏定义的值用圆括号括起来,它现在在工作,谢谢你保存我的理智。 – 2014-09-30 16:06:05

+0

@alk谢谢!我补充说。 – 2014-09-30 16:09:04