这时我在代码下面运行:
#include<iostream>
using namespace std;
//static int x;
int& fun()
{
static int x = 10;
cout<<"in fun"<<endl;
return x;
}
int main()
{
fun() = 30;
cout << fun()<<endl;
return 0;
}
操作:
in fun
in fun
30
在fun()之上因为fun() = 30;
而第一次被调用两次
第二次因为cout << fun()<<endl
陈述。
如果为[{1}}单独调用该函数,则打印的值应为cout << fun()<<endl
而不是10
,否则我会遗漏某些内容?
因为两个函数调用都不同。
当我将x声明为全局静态时:
30
OP:
#include<iostream>
using namespace std;
static int x;
int& fun()
{
x = 10;
cout<<"in fun"<<" "<<x<<endl;
return x;
}
int main()
{
fun() = 30;
cout<<fun()<<endl;
return 0;
}
我只是想知道原因,为什么代码表现得那样? 为什么第一种情况会产生意外的O / P?
当我使用auto x as:
时in fun
in fun
10
它给出了分段错误。 请向我解释一下,我无法得到它。
答案 0 :(得分:3)
当静态是本地的时,在第一次函数调用时将其初始化为10。然后你在main中分配30。第二个调用不会修改静态对象,因为没有赋值;只进行一次初始化。
您使用x = 10;
替换了函数中本地静态的初始化,这是一个赋值操作。因此,函数调用中的赋值将在main中赋值之后。
返回对自动存储持续时间的本地对象的引用。函数返回后,对象将被销毁。函数返回后对该对象的任何访问都有未定义的行为。
答案 1 :(得分:1)
fun() = 30;
调用fun()
将x
初始化为10
。返回x
的引用,将x
设置为30
。
cout << fun()<<endl;
调用fun()
,x
未重新初始化,并返回x
30
的值。
int& fun()
{
int x = 10;
cout<<"in fun"<<endl;
return x;
}
这里返回对fun()
结束时超出范围的局部变量的引用,在main中访问该引用是UB。
答案 2 :(得分:1)
案例1:您正在返回x的引用,因此fun()= 30会更改x的值。 情况2:第二次调用fun将x的值恢复为10。 情况3:x的范围仅限于函数。它不应该在函数之外使用。