C++ 有人能解释一下这个代码是如何执行的吗?

C++ 有人能解释一下这个代码是如何执行的吗?,c++,C++,有人能解释一下代码是如何在这里执行的吗?我不明白第二行的输出是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

有人能解释一下代码是如何在这里执行的吗?我不明白第二行的输出是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;
}  
#包括
使用名称空间std;
//函数通过值和引用传递
内部fn1(内部a、内部b、内部c){
a=b++;
b+=7;
*c=++a;
返回b;
}
int main(){
int x=4,y=7,z=14;

cout您正在为经过的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
接下来的两次呼叫相同

第二行:

x
fn1
修改,因为第一个参数是通过引用传递的

z
fn1
修改,因为指向
z
的指针被传递给函数

c = ++a
第一行:

a = b++
7
分配给
a
,因为
b
7
,而
b++
是一个后增量函数

c = ++a
a
增加到
8
并将
8
分配到
c
,因为
++a
是一个预增量函数

c = ++a

第3行也是如此。

虽然我不确定您期望的输出是什么,但我确实看到了一件可能不是有意的事情

请注意,您的函数
fn1
返回一个int,但是当您在第20行调用它时,它并没有被用来更新任何变量。也许您是想更新y的值

此外,通过添加print语句查看内部变量如何迭代,您可以更好地了解函数的工作方式:

intfn1(int&a、intb、int*c){
a=b++;

cout第一个输出非常简单,而在第二个输出中唯一的区别是函数的返回值,即

b+=7
用于重写Y的原始值。然后在
int fn1(int&a,int b,int*c)
函数中使用新值Y再次调用该函数:

a
通过引用传入。
b
按值传入。
c
由指针传入

a=b++;
修改
x
,因为
a
x
的引用
b+=7;
修改
b
但不修改
y
,因为
b
只是
y
的值
*c=++a;
修改
x
z
,因为
a
x
的引用,
c
是指向
z
的指针

当您使用引用和指针时,可以直接将值写入它们自己的内存空间。但是,当您使用by value(想想
b
)时,将在当前范围内(在
fn1
函数内)创建一个新变量,对它的任何更改都将隔离到该范围内

检查此答案,以阅读更多关于C++中的作用域的内容。


希望这能有所帮助。

我会尽力解释。如果你有足够的耐心,这些指针真的很有趣,也很强大:

fn1(x,y,&z);
cout<< x<< " " << y<< " "<< z<< endl; 
// output: 8 7 8 (I dont get this part!!!)
首先,注意在
fn1(int&a)中
变量a是通过引用传递的,而不是通过值传递的。这意味着我们将直接使用传递给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++;
所以a变为7,b变为8。(如果这让人困惑,请阅读关于运算符的介绍) 然后:

所以b取8+7=??(对不起!我没有数学学位!)

最后:

*c= ++a;
现在,因为我们有了++a,首先a变为a=a+1,现在取8,因为它是7!而*c意味着“指针c指向的变量的值”:所以c指向的变量的值是
z
。所以z的值变为a的任意值(即8)

现在是最后一步(这次是真的)。为什么
y
没有改变? 因为我们
fn1
通过值而不是引用获取b,当函数结束时,var b被销毁

现在试着做第二部分:

 y=fn1(x,y,&z);
在这种情况下,y将接受fn1返回的任何内容!
我真的建议你采取一种循序渐进的方法。如果它仍然令人困惑,请单独练习每种类型的var的行为,通过ref、val和指针传递它。

这是关于指针的。当你输出变量时,它只是指分配的位置,而不是定义的变量。检查这一点,你应该有一个n idea:你为什么不明白?你认为它们应该是什么?记住@NathanOliver,我认为这不是因为增量。我相信他需要理解指针和常用变量。谢谢你的解释。你能解释第3行的输出吗?当我们说y=fn1(x,y,&z)时发生了什么?b的值首先在fn1中递增,因此变为13,然后将7添加到b,使其成为20。现在返回b的值,并将其分配给y。因此,在y=fn1(x,y和z)x=13 y=20和z=13之后,现在第二次调用fn1(x,y和z)a=13 b=20和c=13现在在第一行a=b++a变为20 b变为21 b++=7 b变为28,在第*c=++a=21和c=21行。由于变化是b未反映在y中,最终值将是x=21 y=20和z=21非常感谢您的友好解释。帮助很大。