关于引用和返回值的++背后的语法逻辑

问题描述 投票:1回答:4
int f3(int i, int j) {
    int& k = i;
    ++j;
    return ++k;
}
int main()
{
    int i = 2, j = 4, k;
    k = f3(i, j);
    cout << "i: " << i << " j: " << j << " k: " << k << endl;
    return 0;
}

为什么我得到i = 2k = 3。我的意思是因为我设置了int& k = i,i和k本质上是相同的变量,因为它们共享相同的内存空间。任何人都可以用简单的英语解释为什么会这样吗?或者我不理解什么?

c++ reference pass-by-reference
4个回答
2
投票

在这里你将i设置为2

int i=2,

在这里你通过i

k=f3(i,j);

但是,你传递的是i的副本:

int f3(int i, int j) // you need a "&" in here too if you want to pass the reference

所以在这一行:

int& k = i;

您将k设置为i副本的引用。因此,当你改变它时,来自i的实际main不会改变。

相反,试试这个:

int f3(int &i, int j) { // now you're pssing a reference to i, not a copy thereof

而你的i的输出值将是3。有关通过引用调用的一个很好的示例,请参阅here


1
投票

int f3(int i, int j)

参数i作为值传递。所以在i中声明的变量main和函数中的参数i是不同的变量。如果ii中声明,你需要传递main作为参考,使其成为参考。

int f3(int &i, int j)


1
投票

您可以按值传递参数。

变量k仅引用i函数内的局部变量f3


1
投票

你是对的,我和k本质上是同一个变量。但是,在这行int f3(int i, int j)中,你已经通过值传递了变量i,而不是通过引用。这意味着无论你在函数中对i做出什么修改,它们都不会保存在int main()中。

int f3(int i, int j) {
   int& k = i; // k = 2 and it's a reference to the local variable i
   ++j; 
   return ++k; // k = 3, local variable i = 3
} 

int main() { 
   int i = 2, j = 4, k;
   k = f3(i, j); // k = 3, i and j are unchanged because they were passed by value
   cout << "i: " << i << " j: " << j << " k: " << k << endl;
   return 0;
}

你在这里做了什么int& k = i;,你创建了一个参考k到局部变量i,这只是你的i变量int main()的副本。基本上,kiint main()没有任何伤害。

© www.soinside.com 2019 - 2024. All rights reserved.