2014-09-30 79 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