C++ 接收意外输出
当我运行以下代码时:C++ 接收意外输出,c++,reference,storage,C++,Reference,Storage,当我运行以下代码时: #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; }
#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;
}
上面的fun()第一次被调用两次,因为fun()=30代码>
第二次是因为cout
当静态为本地时,在第一次函数调用时将其初始化为10。然后,你在主体中分配30。第二个调用不会修改静态对象,因为没有赋值;只有一次初始化
将函数中本地静态的初始化替换为x=10代码>,这是一个赋值操作。因此,函数调用中的赋值将在main中的赋值之后
返回对自动存储持续时间的本地对象的引用。函数返回后,对象将被销毁。函数返回后对该对象的任何访问都具有未定义的行为
调用fun()
将x
初始化为10
。返回对x
的引用,将x
设置为30
cout << fun()<<endl;
在这里,当fun()
结束时,返回对超出范围的局部变量的引用,在main中访问该引用是UB。情况1:返回x的引用,因此fun()=30会更改x的值。
案例2:对fun的第二次调用将x的值恢复为10。
案例3:x的范围仅限于功能。请不要在函数之外使用。< /P>请不要在C++问题中标记C。您可以调用fun()
,它返回一个对已初始化为10的静态int的引用,然后用30覆盖该值,这样就可以打印出来。第二个例子不清楚:请包括整个修改的程序。上一个示例中的seg错误并不奇怪,因为您返回了对超出范围的变量的引用。第二个示例不清楚,如果您真的用全局静态行为替换局部静态,则与第一个示例中的行为相同。第三个例子很明显,您不应该返回对局部变量的引用。
#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;
}
in fun
in fun
10
int& fun()
{
int x = 10;
cout<<"in fun"<<endl;
return x;
}
fun() = 30;
cout << fun()<<endl;
int& fun()
{
int x = 10;
cout<<"in fun"<<endl;
return x;
}