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