奇怪的printf行为

Kar*_*gha 4 c++ iterator stl

        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);
Run Code Online (Sandbox Code Playgroud)

输出:

4095 0
0 0
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 10

init或pageSize都不是0.

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

更有可能的是,你需要使用%ld(如果你的long是64位)或%lld(如果你的long长64位)或者来自最新C标准的固定宽度说明符宏,我永远不会忘记我的顶部假设他们在您的环境中可用:-)

如果你接受C++而不是许多程序员似乎存在的那种半边缘(使用传统的东西,比如有stdio.h更好的替代品可用),整个问题可能会消失.您应该使用类型感知:

std::cout << a << ' ' << b << '\n';
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

对于那些真正对机制有兴趣的人,为什么价值观会根据他们的顺序而变化printf,请参阅这个答案.

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

简短的故事:你撒谎,printf所以它对待你的方式与你的重要人物一样,如果你被抓到骗他们:-)

  • @kka,参数顺序不足为奇,因为下一个参数开始于prvious结束的地方:) BTE,因为它是一个`c ++'代码,人们也可以考虑使用iostreams进行输出. (2认同)