收到意外输出

Receiving unexpected output

这里当我 运行 下面的代码 :

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

op:

in fun
in fun
30

上面的 fun() 第一次被调用两次是因为 fun() = 30; 第二次是因为 cout << fun()<<endl 语句。

如果为 cout << fun()<<endl 单独调用该函数,打印的值应该是 10 而不是 30 或者我遗漏了什么?

因为两者调用的函数不同

当我将 x 声明为全局静态时:

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

op:

in fun
in fun
10

我只想知道原因,为什么代码会这样? 为什么第一个案例会产生意外的 O/P?

当我将 auto x 用作:

int& fun()
{
    int x = 10;
    cout<<"in fun"<<endl;
    return x;
}

它给出了分段错误。 请向我解释一下,我无法理解。

  1. 当静态变量是局部变量时,在第一次函数调用时将其初始化为 10。然后你在 main 中分配 30。第二次调用不修改静态对象,因为没有赋值;只有一次初始化。

  2. 你把函数中local static的初始化换成了x = 10;,这是一个赋值操作。因此函数调用中的赋值将在main中的赋值之后。

  3. 您 return 对自动存储持续时间的本地对象的引用。该对象在函数 returns 后被销毁。在函数 returns 之后对该对象的任何访问都具有未定义的行为。

fun() = 30;

调用 fun()x 初始化为 10。对 x 的引用得到 returned,它将 x 设置为 30.

 cout << fun()<<endl;

调用 fun()x 未重新初始化,x 的值 30 被 returned。

int& fun()
{
    int x = 10;
    cout<<"in fun"<<endl;
    return x;
}

这里你 return 对局部变量的引用在 fun() 结束时超出范围,在 main 中访问该引用是 UB。

情况 1:您要返回 x 的引用,因此 fun() = 30 会更改 x 的值。 情况 2:第二次调用 fun 将 x 的值恢复为 10。 情况 3:x 的范围仅限于函数。它不应该在函数之外使用。