奇怪的printf行为

时间:2012-02-24 08:53:18

标签: c++ stl iterator

        std::vector<DWORD64> v;
        for(size_t i = init; i < pageSize; ++i)
            v.push_back(i);

        DWORD64 last =  *(v.rbegin());
        DWORD64 first = *(v.begin());

        printf("%d %d \n", last, first);
        printf("%d %d \n", first, last);

输出:

4095 0
0 0

我无法理解为什么这个printf表现得那样? init或pageSize都不是0。 我理解%d对无符号long long无效,但令我困扰的是当参数的顺序改变时printf的行为会发生变化。

3 个答案:

答案 0 :(得分:10)

  

init或pageSize都不是0.

%d也不是64位值的合适格式字符串说明符,我敢打赌: - )

很可能,您需要使用%ld(如果您的长度为64位)或%lld(如果您的long长度是64位)或者来自的长度为固定宽度的说明符宏最新的C标准,我永远无法记住,假设它们在您的环境中可用: - )

如果你接受C ++而不是许多程序员似乎存在的半边界(如果有更好的替代品可以使用stdio.h之类的遗留内容),整个问题可能会消失。您应该使用类型识别:

std::cout << a << ' ' << b << '\n';

它还有助于使编译器有点智能,并确保使用智能:

pax$ cat qq.cpp
    #include <iostream>
    #include <vector>
    #include <cstdio>

    int main (void) {
        std::vector<int> v;
        v.push_back (111142);
        v.push_back (314159);
        long long a = *(v.begin());
        long long b = *(v.rbegin());
        printf ("%6d %6d, a then b, bad\n", a, b);
        printf ("%6d %6d, b then a, bad\n", b, a);
        std::cout << a << ' ' << b << ", good\n";
        return 0;
    }

pax$ g++ -Wall -Wextra -o qq qq.cpp
    qq.cpp: In function 'int main()':
    qq.cpp:11: warning: format '%d' expects type 'int', but argument 2
        has type 'long long int'
    qq.cpp:11: warning: format '%d' expects type 'int', but argument 3
        has type 'long long int'
    : : : : :
    qq.cpp:12: warning: format '%d' expects type 'int', but argument 3
        has type 'long long int'

pax$ ./qq
    111142 0,      a then b, bad
    314159 0,      b then a, bad
    111142 314159, good

对于那些真正对机制有兴趣的人,可以根据printf中的顺序更改值的变化,请参阅this answer

详细介绍了什么事情(更重要的是,这些事情的大小)被推到了堆栈上,并将它们与你所说的printf进行比较。

长话短说:你骗了printf所以它对待你就像你的重要人一样,如果你被骗到他们那里: - )

答案 1 :(得分:1)

第一个printf实际上打印了DWORD64变量last的LO和HI DWORD(我相信这是4095)。第二个printf打印DWORD64变量first的LO和HI DWORD(为0)。两行中都忽略第二个DWORD64参数...

答案 2 :(得分:0)

我的猜测是你所针对的环境%d不适用于64位数量。试试%I64