首页 > 解决方案 > 注释掉部分单独声明时的不同输出

问题描述

我有这段代码,我偶然发现了一些我不明白的东西。

#include <iostream>
#include <utility>
using namespace std;

    void getMinMax(double &a, double& b, double& c, double*& ptrMin, double*& ptrMax) {

            if (a > b)
                swap(a, b);
            if (a > c)
                swap(a, c);
            if (b > c)
                swap(b, c);

            ptrMin = &a;
            ptrMax = &c;
    }


    void getMinMax(double *a, double* b, double* c, double** ptrMin, double** ptrMax) {

        if (*a > *b)
            swap(*a, *b);
        if (*a > *c)
            swap(*a, *c);
        if (*b > *c)
            swap(*b, *c);

        ptrMin = &a;
        ptrMax = &c;

    }

    void ord3(double& a, double& b, double& c) {

        if (a > b)
            swap(a, b);
        if (a > c)
            swap(a, c);
        if (b > c)
            swap(b, c);
    }

    void ord3(double* a, double* b, double* c) {

        if (*a > *b)
            swap(*a, *b);
        if (*a > *c)
            swap(*a, *c);
        if (*b > *c)
            swap(*b, *c);
    }

    void printOrd(const double* a, const double* b, const double* c) {
        cout << *a << " " << *b << " " << *c << endl;
    }

    void printMinMax(const double* pmn, const double* pmx) {
        cout << "Min = " << *pmn << "; "
        << "Max = " << *pmx << endl;
    }


    int main() {

        double a, b, c, *ptrMin, *ptrMax;

        a = 2; b = 1; c = 3;
        ord3(a,b,c);
        printOrd(&a, &b, &c);

        a = 3; b = 2; c = 1;
        ord3(&a,&b,&c);
        printOrd(&a, &b, &c);

        a = -1; b = -1; c = 1;
        ord3(&a,&b,&c);
        printOrd(&a, &b, &c);


        /*a = 2; b = 3; c = 1;
        getMinMax(a,b,c,ptrMin,ptrMax);
        printMinMax(ptrMin, ptrMax);*/

        a = 3; b = 1; c = 2;
        getMinMax(&a,&b,&c,&ptrMin,&ptrMax);
        printMinMax(ptrMin, ptrMax);


        a = 3; b = 3; c = -1;
        getMinMax(&a,&b,&c,&ptrMin,&ptrMax);
        printMinMax(ptrMin, ptrMax);

}

我发现当我评论这部分时:

*a = 2; b = 3; c = 1;
getMinMax(a,b,c,ptrMin,ptrMax);
printMinMax(ptrMin, ptrMax);

然后我得到这样的输出:

错误输出显示浮点值的垃圾值

但是当我正常运行它时,我得到了我所期望的:

预期结果的正常输出

这怎么可能?在我看来,这是完全独立的声明,不应该影响其余代码,还是我遗漏了什么?

标签: c++pointersreference

解决方案


在第二个getMinMax通过指针传递值的地方,最后的赋值改变了局部变量,而不是指向的值。您需要删除一个间接级别才能从调用者那里获取值:

*ptrMin = a;
*ptrMax = c;

这适用于启用的参考版本,因为它正在更新变量main(尽管后续结果可能不是正确的最小/最大值)。


推荐阅读