簡體   English   中英

奇怪的printf行為

[英]Strange printf behavior

        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的行為會發生變化。

init或pageSize都不是0。

對於64位值, %d也不是合適的格式字符串說明符,我敢打賭:-)

更有可能的是,你需要使用%ld (如果你的long是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的順序而變化,請參閱這個答案

它詳細介紹了什么東西(更重要的是,這些東西的大小)被推到了堆棧上,將它們與你告訴printf內容進行比較。

長話短說:你騙了printf所以它對待你就像你的另一個人一樣,如果你被抓到騙他們:-)

事實上,第一個printf last打印了DWORD64變量的LO和HI DWORD(我相信這是4095)。 第二個printf打印出DWORD64變量的LO和HI個DWORD first (其為0)。 兩行中都忽略第二個DWORD64參數...

我的猜測是在你所針對的環境中%d不適用於64位數量。 試試%I64

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM