在尝试手动解决时,我无法理解如何获取以下 C++ 代码输出的正确值。
#include <iostream>
using namespace std;
int f(int a, int & b,int *c){
a += 1;
b += 3;
*c += 4;
return a+b+(*c);
}
int main() {
int a = 3, b = 4,c = 5;
cout << "total: " << f(b,c,&a) << endl;
cout << "a= " << a << " b= " << b << " c= " << c << endl;
a = 3, b = 4,c = 5;
cout << "total: " << f(a,a,&a) << endl;
cout << "a= " << a << " b= " << b << " c= " << c << endl;
return 0;
}
我知道结果应该是:
total: 20
a= 7 b= 4 c= 8
total: 24
a= 10 b= 4 c= 5
但每次我尝试手动解决此代码(尝试在一张纸上写下步骤和作业)时,我似乎无法获得正确的总数或值。任何人都可以帮助我理解函数内部发生的事情,包括 a、b 和 c(也许是逐步解释?)。必须有一些我不理解的引用/取消引用或导致我的逻辑错误的指针。甚至 ChatGPT 在尝试执行代码后也吐出了错误的答案......
例如,如果我尝试函数内的第一组输入,这就是我的理解:
然后开始执行函数体:
最终的结果是 a = 7,b = 4(没有改变),c = 8。这些值是正确的,但是函数的返回部分不适用于这些值:
a+b+(*c) 应该是 7+4+(7),但结果是 18,而正确答案是 20。
最糟糕的是,如果我第二次使用相同的逻辑调用该函数,我的值不正确但我的总数是正确的......我迷路了。
最终的结果是 a = 7,b = 4(没有改变),c = 8。 这些值是正确的,但函数的返回部分不正确 使用这些值:
让您感到困惑的是,
a
中的b
、c
和main
与a
中的b
、c
和f()
不同。的
return a+b+(*c);
使用
f()
所知道的a
、b
和c
。这是f()
的一部分。 f()
的变量是这个 return
语句唯一知道的,它完全不知道 main
中的任何变量。所以要知道这些变量是什么,你只需要重新阅读你自己写的内容:
a += 1 现在给我 a = 5;
b += 3 现在给我 c = 8 因为 b 是一个参考
但是这个
b
,就在这里是非常精确的,与b
表达式中的return
相同。
*c += 4 现在将存储在 &a 中的值初始化为 3 并添加 4,因此 a 的新值为 7;
但这就是表达式中的
c
。所以
return a+b+(*c);
计算
5+8+7
或 20
,如您所见。
第二个表达式以同样的方式工作。
f()
的变量使用与 main()
中的变量相同的名称这一事实让您感到困惑。一个指针和引用引用另一个中的变量也无济于事。
重命名
f()
中的变量可能对您有所帮助:
int f(int x, int & y,int *z){
x += 1;
y += 3;
*z += 4;
return x+y+(*z);
}
这在逻辑上应该等同于原始功能,但混淆较少。