注释掉部分单独声明时的不同输出

Posted

技术标签:

【中文标题】注释掉部分单独声明时的不同输出【英文标题】:Different output while commenting out part of seperate declaration 【发布时间】:2019-08-17 15:27:52 【问题描述】:

我有这段代码,但我偶然发现了一些我不理解的东西。

#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);

然后我得到这样的输出:

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

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

【问题讨论】:

未定义的行为会在远处产生影响,甚至会在时间上产生影响。 请不要链接到与问题相关的外部网站。 特别是不要链接到图片。请将所有与问题相关的in 发布为text 您为什么不直接使用std::minmax、std::minmax_element 或其他现成的算法之一来从容器中获取最小值或最大值?在我看来,这看起来像是一堆冗余代码,应该使用标准算法替换为一两行代码。 你究竟为什么将非指针变量视为指针? 【参考方案1】:

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

*ptrMin = a;
*ptrMax = c;

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

【讨论】:

“你需要删除一个间接级别..” - 不,他需要停止重新发明***并开始使用<algorithm>。

以上是关于注释掉部分单独声明时的不同输出的主要内容,如果未能解决你的问题,请参考以下文章

LaTeX 可不可以注释掉一行的某一部分

注释掉文件中两个不同模式之间的行

C数组分配过程-一次或单独-部分数组分配-不同的输出[重复]

注释掉 Vue 模板元素的一部分

如何在 PHP 中注释掉正则表达式的 */ 部分

注释掉Vue模板元素的一部分