printf中的两个动态参数

时间:2012-05-30 15:54:52

标签: c

#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代替计数器!对这个奇怪的事实的任何解释?

3 个答案:

答案 0 :(得分:3)

time()会返回time_t类型,在许多平台上都是64位,而"%d"是指int,大多数是32位。

答案 1 :(得分:2)

%d格式说明符表示printf期待int类型。但time()会返回time_t;如果它大于int,那么堆栈上的东西将比printf期望的更多,基本上抵消了所有后续参数的位置(因此时间值的高位字节被解释为第二个论点,在你的情况下)。

(要确认,您应该比较sizeof(int)sizeof(time_t)。)

有关可能的解决方案,请参阅例如这个问题:What primitive data type is time_t?

答案 2 :(得分:1)

time()的结果(至少在Windows上)是64位整数。您必须使用%d以外的格式进行打印。试试%lld

由于英特尔是一个小端处理器,所以当时间到了最后因为你得到了较低的32位。