参考文献 - 为什么以下两个程序产生不同的输出?

时间:2015-06-19 03:35:55

标签: c++ reference static output

我最近阅读了C ++中的引用。我知道引用的基本属性,但我仍然无法弄清楚为什么跟随两个程序产生不同的输出。

#include<iostream>
using namespace std;

int &fun()
{
    static int x = 10;
    return x;
}
int main()
{
    fun() = 30;
    cout << fun();
    return 0;
} 

此程序打印30作为输出。根据我的理解,函数fun()返回对x占用的内存位置的引用,然后为30分配值,并在fun()的第二次调用中分配声明被忽略。 现在考虑这个程序:

#include<iostream>
using namespace std;

int &fun()
{
    int x = 10;
    return x;
}
int main()
{
    fun() = 30;
    cout << fun();
    return 0;
}

此程序将输出生成为10。是因为,在第一次通话后,x被分配了30,并且在第二次通话后,它又被覆盖到10,因为它是一个局部变量?我错了吗?请解释一下。

3 个答案:

答案 0 :(得分:3)

在第一种情况下,无论您调用多少次,fun()都会返回对同一变量的引用。

在第二种情况下,fun()会在每次调用时返回对不同变量的悬空引用。函数返回后,引用无效。

使用时

fun() = 30;

在第二种情况下,您要设置的变量值不再有效。从理论上讲,这是不确定的行为。

在第二种情况下第二次拨打fun()时,变量x设置为10。这与对同一函数的第一次调用无关。

答案 1 :(得分:0)

只是添加到已经说过的内容。第一个案例行为背后的原因是因为它是static变量,具有静态持续时间。静态持续时间表示在程序启动时分配对象或变量,并在程序结束时取消分配。

这意味着第一种情况下x第一次使用10初始化后,下一次函数调用将忽略static int x = 10;,因为x无法再次实例化,因为它已经被分配,并且只会继续return x;,这与x中分配了30的{​​{1}}相同。

答案 2 :(得分:0)

基本上,你的理解是正确的,除了在第二种情况下,你正在处理局部变量的悬挂引用已经无效,这是未定义的行为,意味着一切皆有可能。你说的只是其中一种可能性,它也可能导致其他的,例如获取随机数,程序崩溃等。