我尝试在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的值,当它返回时?这里真的发生了什么。
请提供您的意见和建议。
答案 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() =30
将30
分配给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()
,其中首先分配x
和y
,其值为10和20。然后你给它的返回值赋值30(在这种情况下,引用'x')。
因此,当再次呼叫fun()
时,它会打印30(我们修改的x
)和y
的20,而我们没有。{/ p>
fun()
内的变量为static
,因此一旦初始化,它们就不会再次初始化。
现在显而易见的是,当您将返回变量更改为y
时,您获得了该输出