c++ - 注释掉部分单独声明时的不同输出
问题描述
我有这段代码,我偶然发现了一些我不明白的东西。
#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);
然后我得到这样的输出:
但是当我正常运行它时,我得到了我所期望的:
这怎么可能?在我看来,这是完全独立的声明,不应该影响其余代码,还是我遗漏了什么?
解决方案
在第二个getMinMax
通过指针传递值的地方,最后的赋值改变了局部变量,而不是指向的值。您需要删除一个间接级别才能从调用者那里获取值:
*ptrMin = a;
*ptrMax = c;
这适用于启用的参考版本,因为它正在更新变量main
(尽管后续结果可能不是正确的最小/最大值)。
推荐阅读
- javascript - 获取 context.config.failTestOn 错误 Log.exclude Keywords.forEach 不是量角器中的函数错误
- html - 了解浮动 div 周围的文本换行
- python - 为主教不工作生成对角线移动的位板
- c - 线程 1:EXC_BAD_ACCESS(代码=1,地址=0x7ffeefc00000)
- statistics - 组合2个相同分布的数组
- c# - 统一更改粒子系统开始颜色的范围
- css - 如何在 Bootstrap 中裁剪 GoogleAPI 二维码图像?
- r - ggplot 多边形 X 轴和 Y 轴缩放并更改组的颜色
- php - Codeigniter 中的 Ajax 文件上传
- java - 没有为 public com.phonepe.gandalf.models.authz.Permission 类型的参数找到注入源