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 对 unsigned long long 无效,但令我困扰的是当参数的顺序改变时 printf 的行为改变。
最佳答案
Neither init or pageSize is 0.
%d
也不是适合 64 位值的格式字符串说明符,我敢打赌:-)
很有可能,您需要使用 %ld
(如果您的 longs 是 64 位)或 %lld
(如果您的 long longs 是 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
撒了谎,所以如果你被发现对他们撒谎,它就会像对待你的另一半一样对待你:-)
关于c++ - 奇怪的 printf 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9427885/