繁体   English   中英

有人可以解释一下这段代码是如何执行的吗?

[英]Can someone explain me how exactly this code is executed?

有人可以在这里解释代码的执行方式吗? 我不明白第二行的输出是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;
}  

您正在为传递的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

接下来的两个电话相同

第二行:

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

fn1修改了z ,因为将指向z的指针传递给该函数。

第一行:

a = b++

a分配为7 ,因为b7b++是后递增函数。

c = ++a

因为++a是一个预递增函数,所以将a递增到8并将c分配给8

第3行也是如此。

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

请注意,函数fn1返回一个int,但是在第20行调用它时,该函数并未用于更新任何变量。 也许您打算更新y的值?

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

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;
}

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

b+=7

用于重写Y的原始值。 然后使用新值Y再次调用该函数。

在您的int fn1(int &a, int b, int *c)函数中:

a通过引用传递英寸
b按值传递。
c通过指针传递。

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

使用引用和指针时,可以将值直接写入其自己的内存空间。 但是,当您按值使用(认为b )时,会在当前范围内(在fn1函数内部)创建一个新变量,并且fn1任何更改都将隔离到该范围内。

查看此SO答案,以了解有关C ++范围的更多信息。 https://stackoverflow.com/a/11345787/1000437

希望这可以帮助。

我会尽力解释。 如果您有足够的耐心,这些指针将非常有趣且功能强大:

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是通过引用而不是通过值传递的。 这意味着我们将直接使用传递给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。(如果这令人困惑,请阅读有关操作符的简介this )然后:

b+=7; //same as: b=b+7;

所以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和后来的指针传递它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM