这段用C ++编写的代码如何工作?

时间:2015-09-02 10:48:47

标签: c++ function reference variable-assignment

我尝试在GeekForGeeks中执行以下代码。我在这里粘贴这段代码。我有多个问题,我最后会陈述它们

#include<iostream>
using namespace std;

int &fun()
{
    static int x = 10;
    static int y = 20;
    cout<<"\nAfter Assign\n"<<x<<"\n"<<y;
    return x;
}
int main()
{
    fun() = 30;
    cout <<"\nFun\n"<< fun();
    return 0;
}

Gives Output

After Assign
10
20
After Assign
30
20
Fun
30

当我将返回变量更改为y时,如下面的代码所示。

#include<iostream>
using namespace std;

int &fun()
{
    static int x = 10;
    static int y = 20;
    cout<<"\nAfter Assign\n"<<x<<"\n"<<y;
    return y;
}
int main()
{
    fun() = 30;
    cout <<"\nFun\n"<< fun();
    return 0;
}

Output is as follows:

After Assign
10
20
After Assign
10
30
Fun
30

Q1:如输出中所示,在第一次调用期间,我可以看到x和y的值打印为10和20。那么有趣()= 30,没有效果? 30存储的值在哪里?

Q2:当分配fun()= 30时,实际上是什么行为。它们是否未分配给fun()中的变量?

问题3:为什么x 30的值,当它被返回时,为什么是y 30的值,当它返回时?这里真的发生了什么。

请提供您的意见和建议。

4 个答案:

答案 0 :(得分:2)

  

Q1:如输出中所示,在第一次调用期间,我可以看到x和y的值打印为10和20。那么有趣()= 30,没有效果? 30存储的值在哪里?

这是不正确的:

cout<<"\nAfter Assign\n"<<x<<"\n"<<y;

它在赋值之前执行,你的int &fun()函数返回x变量的引用,fun返回后将被赋值。

  

Q2:当分配fun()= 30时,实际上是什么行为。它们是否未分配给fun()中的变量?

已分配,但在有趣的返回后,行为是函数内的静态变量更改值

  

问题3:为什么x 30的值,当它被返回时,为什么是y 30的值,当它返回时?这里到底发生了什么。

不确定如果我理解,因为你已经分配了这个值 - int &fun()会返回对x或y变量的引用。由于它们是静态的,你可以这样做 - 这里没有UB。

您可以为自己设想fun() = 30;的行为类似于x = 30;(或y = 30)。

答案 1 :(得分:2)

Q1:在函数调用之后发生赋值,因此第一次调用会打印原始静态值;

Q2:fun() =3030分配给fun()返回的值,这恰好是对变量x的引用(y static fun这意味着它的存储在调用fun时保持不变。

问题3:当fun返回时,它返回对静态变量x的引用,因此赋值会修改此变量的值。如果返回的值不是引用,则返回的值将是副本,并且不会修改原始值。

答案 2 :(得分:0)

  

那么有趣()= 30没有效果?

它有效:y现在是30!

程序启动,进入fun()。第一次调用导致init为x到10和y到20.之后返回对y的引用。

这些参考用于将y设置为30。

接下来调用fun()打印出10和30,这正是我们所期望的。

请阅读c ++的初学者书。特别是你必须阅读reference是什么。

答案 3 :(得分:0)

fun()返回对返回变量的引用。

在第一种情况下,您正在调用fun(),其中首先分配xy,其值为10和20。然后你给它的返回值赋值30(在这种情况下,引用'x')。

因此,当再次呼叫fun()时,它会打印30(我们修改的x)和y的20,而我们没有。{/ p>

fun()内的变量为static,因此一旦初始化,它们就不会再次初始化。

现在显而易见的是,当您将返回变量更改为y时,您获得了该输出