簡體   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