问题描述
#include <iostream>
using namespace std;
int fun1(int p){
++p;
return p++;
}
int fun2(int &p){
++p;
return p++;
}
int main(void){
int a = 1,b,c;
b = fun1(a);
c = fun2(b);
cout<< a + b + c << endl;
return 0;
}
我在不运行程序的情况下得到的答案是 6 (a=1,b=2,c=3)。 但是,在您运行程序后,答案返回 8 (a=1,b=4,c=3)。
有人能解释一下你是如何得到每个答案的吗?
解决方法
这次通话之后
b = fun1(a);
a 将保持不变,因为它是按值传递给函数的,而 b 将等于 2。
在这次通话中
c = fun2(b);
变量b在函数内增加了两次,因为它是通过引用传递给函数的
int fun2(int &p){
++p;
return p++;
}
所以调用函数后 b 将等于 4 但变量 c 将等于 3,因为后增量运算符的值
return p++;
是其操作数在递增之前的值。
所以你有
1 + 4 + 3
,
首先你需要了解前增量和后增量以及地址
我会逐个解释你的代码功能
所以在 fun1
中,当您将 a (a=1)
作为 p
传递时起作用
++p
是一种预增量方法
它首先将 p 增加 1 然后返回 p ,所以这里 p 现在是 2
在下一行中,当您返回 p++
时,p++
是一种后增量方法,即首先返回然后增加 1。
所以 fun1 返回 2
并且b的值变为2;
现在进入下一个功能
这里请注意,您传递了对 p 的引用,而不仅仅是 p 即如果您在此处更改 p
,原始 p
(对您传递的变量的引用)也会更改
所以你在这里++p
它的预增量,因此它将 p
的值增加 1,
请注意,您已将 b
作为 p
传递,b 的值也会从 2 变为 3,
现在在下一行,您返回 p++
,3 作为 fun2 的值返回。
请注意 p++
首先返回 3,但也会将 p 增加 1,因为您将 p 的引用作为 b 传递,b 增加 1,b 变为等于 4。
我想现在很清楚了,