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;
    }