有人可以在这里解释代码是如何执行的吗?我不明白第二行的输出是8 7 8,第三行的输出是21 20 21。
#include<iostream>
using namespace std;
//Funtion passed by value and by reference
int fn1(int &a, int b, int *c){
a=b++;
b+=7;
*c= ++a;
return b;
}
int main(){
int x=4, y=7, z=14;
cout<< x<< " " << y<< " "<< z<< endl; // output: 4 7 14
fn1(x,y,&z);
cout<< x<< " " << y<< " "<< z<< endl; // output: 8 7 8 (I dont get this part!!!)
x=9, y=12, z=19;
y=fn1(x,y,&z);
fn1(x,y,&z);
cout<< x<< " " << y<< " "<< z<< endl; // output: 21 20 21(I dont get this part!!!)
return 0;
}
答案 0 :(得分:2)
您正在为传递的b和c的地址
创建引用a is a reference to x hence any change in value of a is reflected in x
since y is passed by value any change in value of b will not change y
and for z as its address is passed any change to the location will be reflected in z
for a = b++
a gets the value 7 and b is incremented to 8(post increment)
b+=7
*c = ++a
a will become 8 and will get assigned to address pointed by c
hence you get output as 8 7 8 as x will be a y will remain 7 and z will be c
接下来的两个电话相同
答案 1 :(得分:0)
第二行:
x
由fn1
修改,因为第一个参数是通过引用传递的。
z
由fn1
修改,因为指向z
的指针会传递给函数。
第一行:
a = b++
将7
分配给a
,因为b
是7
而b++
是后增量功能。
c = ++a
将a
增加到8
并将8
分配给c
,因为++a
是预增量功能。
第3行也是如此。
答案 2 :(得分:0)
虽然我不确定你对输出的期望是什么,但我确实看到了一件可能不是故意的事情。
请注意,函数fn1
返回一个int,但是当您在第20行调用它时,它不会用于更新任何变量。也许你想更新y的值?
此外,通过添加print语句来查看内部变量如何迭代,您可以更好地了解函数的工作原理:
int fn1(int &a, int b, int *c){
a=b++;
cout << "a: " << a << " ";
b+=7;
cout << "b: " << b << " ";
*c= ++a;
cout << "c: " << *c << endl;
return b;
}
答案 3 :(得分:0)
第一个输出非常简单,而在第二个输出中唯一的区别是函数的返回值,即
b+=7
用于重写 Y 的原始值。然后使用新值 Y 再次调用该函数。
答案 4 :(得分:0)
在int fn1(int &a, int b, int *c)
函数中:
a
通过引用传递。
b
按值传入
c
由指针传入。
a = b++;
修改了x
,因为a
是x
的引用。
b += 7;
修改b
但不修改y
,因为b
只是y
的值。
*c = ++a;
修改了x
和z
,因为a
是x
的引用,而c
是z
的指针。
使用引用和指针时,可以直接将值写入自己的内存空间。但是,当您按值使用时(考虑b
),在当前范围内(fn1
函数内部)创建一个新变量,并且对它的任何更改都与该范围隔离。
查看此SO答案以阅读有关C ++中范围的更多信息。 https://stackoverflow.com/a/11345787/1000437
希望这有帮助。
答案 5 :(得分:0)
我会尝试解释。如果你有足够的耐心,指针真的很有趣和强大:
fn1(x,y,&z);
cout<< x<< " " << y<< " "<< z<< endl;
// output: 8 7 8 (I dont get this part!!!)
让我们来看看我们的函数fn1
int fn1(int &a, int b, int *c){
a=b++;
b+=7;
*c= ++a;
return b;
}
首先请注意,在fn1(int &a)
变量中,a通过引用传递,而不是通过值传递。这意味着我们将直接使用我们传递的值。它基本上意味着如果您更改函数内部的值,则更改将持久。因此,自int x=4, y=7, z=14;
我们调用fn1(x, y, &z)
后,我们将变量x传递给a(将其视为从x暂时重命名为a)。所以a
最初是4. b只是一个值,因此y的内容传递给b而* c是一个指针,只是将z的物理地址作为值(这就是为什么你有fn1(&z)
)。
因此,当我们调用函数fn1(x, y, &z)
时,我们执行:
a=b++;
因此更改为7,b更改为8.(如果这令人困惑,请阅读有关运算符this的介绍) 然后:
b+=7; //same as: b=b+7;
所以b取值8 + 7 = ?? (对不起!我没有数学学位!)
最后:
*c= ++a;
现在,因为我们有++ a,所以首先更改为a = a + 1,现在取值为8,因为它是7! * c表示&#34;指针c指向&#34;的变量的值:所以c指向的变量的值是z
。所以z的值被改变为a(是8)。
现在是最后一步(这次真实)。为什么没有y
改变?
因为我们fn1
通过值而不是通过引用获取b,并且当函数结束时,var b被销毁。
现在尝试做第二部分:
y=fn1(x,y,&z);
在这种情况下,y将采取任何fn1返回! 我真的建议你采取一步一步的方法。如果它仍然令人困惑,请单独使用每种类型的var的行为,通过ref,val和后来的指针传递它。