参考资料 - 为什么以下两个程序产生不同的输出?
References - Why do the following two programs produce different 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()
returns 对 x
占用的内存位置的引用,然后分配值 30
并在 [=13 的第二次调用中=] 赋值语句被忽略。
现在考虑这个程序:
#include<iostream>
using namespace std;
int &fun()
{
int x = 10;
return x;
}
int main()
{
fun() = 30;
cout << fun();
return 0;
}
此程序产生的输出为 10
。是不是因为第一次调用后,x
被赋值为30
,第二次调用后又被覆盖为10
,因为它是一个局部变量?我哪里错了吗?请解释。
在第一种情况下,fun()
returns 对同一个变量的引用,无论您调用它多少次。
在第二种情况下,fun()
returns 每次调用时对不同变量的悬空引用。在函数 returns.
之后引用无效
当你使用
fun() = 30;
在第二种情况下,您设置的变量值不再有效。理论上,这是未定义的行为。
当你在第二种情况下第二次调用fun()
时,变量x
被设置为10
。这与第一次调用同一函数无关。
只是对已经说过的内容进行补充。第一种情况的行为背后的原因是因为它是一个 static
变量,具有静态持续时间。静态持续时间是指对象或变量在程序启动时分配,在程序结束时释放。
这意味着一旦x
第一次用10
初始化,下一个函数调用将忽略static int x = 10;
,因为x
不能再次实例化,因为它已经被分配,并且将简单地继续 return x;
,这将与 main
中分配的 30
相同 x
。
基本上,你的理解是正确的,除了第二种情况,你正在处理的局部变量的悬空引用已经无效,这是未定义的行为,意味着一切皆有可能。你说的只是其中一种可能,还可能导致其他的,比如获取随机数,程序崩溃等
我最近阅读了 C++ 中的引用。我知道引用的基本属性,但我仍然无法弄清楚为什么以下两个程序会产生不同的输出。
#include<iostream>
using namespace std;
int &fun()
{
static int x = 10;
return x;
}
int main()
{
fun() = 30;
cout << fun();
return 0;
}
此程序打印 30
作为输出。根据我的理解,函数 fun()
returns 对 x
占用的内存位置的引用,然后分配值 30
并在 [=13 的第二次调用中=] 赋值语句被忽略。
现在考虑这个程序:
#include<iostream>
using namespace std;
int &fun()
{
int x = 10;
return x;
}
int main()
{
fun() = 30;
cout << fun();
return 0;
}
此程序产生的输出为 10
。是不是因为第一次调用后,x
被赋值为30
,第二次调用后又被覆盖为10
,因为它是一个局部变量?我哪里错了吗?请解释。
在第一种情况下,fun()
returns 对同一个变量的引用,无论您调用它多少次。
在第二种情况下,fun()
returns 每次调用时对不同变量的悬空引用。在函数 returns.
当你使用
fun() = 30;
在第二种情况下,您设置的变量值不再有效。理论上,这是未定义的行为。
当你在第二种情况下第二次调用fun()
时,变量x
被设置为10
。这与第一次调用同一函数无关。
只是对已经说过的内容进行补充。第一种情况的行为背后的原因是因为它是一个 static
变量,具有静态持续时间。静态持续时间是指对象或变量在程序启动时分配,在程序结束时释放。
这意味着一旦x
第一次用10
初始化,下一个函数调用将忽略static int x = 10;
,因为x
不能再次实例化,因为它已经被分配,并且将简单地继续 return x;
,这将与 main
中分配的 30
相同 x
。
基本上,你的理解是正确的,除了第二种情况,你正在处理的局部变量的悬空引用已经无效,这是未定义的行为,意味着一切皆有可能。你说的只是其中一种可能,还可能导致其他的,比如获取随机数,程序崩溃等