2012-05-30 15 views
1
#ifndef UNICODE 
#define UNICODE 
#endif 

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

int main() 
{ 
    char buffer[30]; 
    int counter=0; 

    for(int i=0; i<22 ; i++) 
    {  
     Sleep(1000); 
     printf("%d %d\n",counter++,time(0)); 
    } 

    system("pause"); 
    return 0; 
} 

該版本正常工作,它輸出計數器和最後22秒的時間戳。不幸的是,當我看似無關的事情 - 替換計數器和時間(0),即printf("%d %d\n",time(0),counter++);時,函數始終打印0代替計數器!這個奇怪的事實的任何解釋?printf中的兩個動態參數

+0

你在哪個平臺上,那裏有什麼'sizeof(time_t)'? –

+0

平臺上'time'的實際返回類型是什麼?對於我們所知的所有情況,它可能是「double」或「char [13]」。 –

回答

1

time()(在Windows上至少)的結果是一個64位整數。您必須使用%d以外的格式來打印它。試試%lld

由於英特爾是一個小端處理器,所以在時間最後的時候它工作,因爲你得到了低32位。

3

time()返回鍵入time_t,這是64位在許多平臺,而"%d"int其中大部分是32位。

2

%d格式說明符表示printf預計爲int類型。但time()返回time_t;如果這比int大,那麼比起printf預期的更多的東西將被放置在堆棧上,基本上抵消了所有後續參數的位置(因此在你的情況下時間值的高字節被解釋爲第二參數)。

(爲了確認,你應該比較sizeof(int)sizeof(time_t)

對於潛在的解決方案,看到答案如這個問題:What primitive data type is time_t?