c++ - 奇怪的 printf 行为

标签 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 对 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/

相关文章:

c++ - 给定一个元素的地址搜索二维数组

c++ - 我想完善除特定类型之外的前向可变参数

c++ - find_if 和 std::pair,但只有一个元素

c++ - 从嵌套迭代的列表中删除

reference - 如何将具体类型的迭代器特征对象转换为特征对象的迭代器特征对象?

c++ - 将 MYSQL 时间戳转换为 time_t

c++ - Qt 5.4 静态构建在 Visual Studio 2013 中产生 "unresolved external symbol"链接错误

c++ - 扩展 std::unordered_set<> 以与 std::stack<> 一起使用

c++ - 根据多个条件处理 map 中的所有元素

c++ - 我可以使用 std::shared_ptr 而不是 boost::shared_ptr 构建 boost 库吗