接收意外的输出

时间:2017-11-03 08:52:53

标签: 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;
}

操作:

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

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

3 个答案:

答案 0 :(得分:3)

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

  2. 您使用x = 10;替换了函数中本地静态的初始化,这是一个赋值操作。因此,函数调用中的赋值将在main中赋值之后。

  3. 返回对自动存储持续时间的本地对象的引用。函数返回后,对象将被销毁。函数返回后对该对象的任何访问都有未定义的行为。

答案 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的范围仅限于函数。它不应该在函数之外使用。