簡體   English   中英

cout語句更改程序語義

[英]cout statement change program semantics

我有以下一段代碼,它屬於類的一部分,希望它們的詳細信息對於回答該問題並不重要。 我不希望確切地解決我的問題,而只是要解釋一下,我將要描述的行為是如何發生的。

    Character operator+(Character c) {
        std::vector<float> resDensity(density);
        float l;
        float dh;
        for (int i = 0; i < domains.size(); i++) {
            for (int j = 0; j < c.domains.size(); j++) {
                l = (domains[i].intersection(c.domains[j])).length();
                //std::cout << l;
                dh = c.density[j] * l / domains[i].length();
                resDensity[i] += dh;
            }
        }
        std::vector<Domain> h(domains);
        return Character(h, resDensity);
    }

您可能已經注意到了注釋的cout語句。 由於我的程序中存在數字錯誤,我遵循了假值,直到我檢測到變量l 因此,我將其打印到控制台上,發現它的值恰好是我需要的值,並且該程序也可以正常運行,並且該錯誤也消失了。 再次取消注釋會導致意外的不良行為。

Character類包含domainsdensity字段,兩個vector都是...

lengthintersection方法:

    float length() {
        float res;
        for (int i = 0; i < is.size(); i++) {
            res += is[i].b - is[i].a;
        }
        return res;
    }

    Domain intersection(Domain d) {
        std::vector<Interval> hi;
        for (auto i = is.begin(); i != is.end(); i++) {
            for (auto j = d.is.begin(); j != d.is.end(); j++) {
                hi.push_back(i->intersection(*j));
            }
        }
        Domain hhh(hi);
        return hhh;
    }

我用g++ --std=c++11 ...編譯代碼g++ --std=c++11 ...

g++ --version
g++ (GCC) 4.8.2 20131219 (prerelease)

在你的length()函數中, res變量是未初始化的:

    float res;
    for (int i = 0; i < is.size(); i++) {
        res += is[i].b - is[i].a;   // <-- uses an uninitialized res
    }

如何在Domain計算length() hhh是您要返回的局部變量,因此將進行復制。 如果length()依賴於未復制的內容,那么您將看到奇怪的行為。 如果你只是改變intersection()來返回一個浮點數或者創建一個名為intersectionLength()的不同方法來返回一個浮點數 - 你還能得到heisenbug嗎?

暫無
暫無

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

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