参考-为什么以下两个程序产生不同的输出? 最近我阅读了C++中的引用。我知道引用的基本属性,但我仍然无法理解为什么下面两个程序会产生不同的输出 #include<iostream> using namespace std; int &fun() { static int x = 10; return x; } int main() { fun() = 30; cout << fun(); return 0; }
此程序产生的输出为参考-为什么以下两个程序产生不同的输出? 最近我阅读了C++中的引用。我知道引用的基本属性,但我仍然无法理解为什么下面两个程序会产生不同的输出 #include<iostream> using namespace std; int &fun() { static int x = 10; return x; } int main() { fun() = 30; cout << fun(); return 0; },c++,reference,static,output,C++,Reference,Static,Output,此程序产生的输出为10。是因为在第一次调用之后,x被赋值为30,而在第二次调用之后,由于它是一个局部变量,它又被重写为10?我哪里错了?请解释。在第一种情况下,fun()返回对同一变量的引用,无论调用多少次 在第二种情况下,fun()在每次调用时返回对不同变量的悬空引用。函数返回后,引用无效 当你使用 fun() = 30; 在第二种情况下,设置的变量值不再有效。理论上,这是一种未定义的行为 在第二种情况下,当您第二次调用fun()时,变量x被设置为10。这与对同一函数的第一次调用无关。只是增
10
。是因为在第一次调用之后,x
被赋值为30
,而在第二次调用之后,由于它是一个局部变量,它又被重写为10
?我哪里错了?请解释。在第一种情况下,fun()
返回对同一变量的引用,无论调用多少次
在第二种情况下,fun()
在每次调用时返回对不同变量的悬空引用。函数返回后,引用无效
当你使用
fun() = 30;
在第二种情况下,设置的变量值不再有效。理论上,这是一种未定义的行为
在第二种情况下,当您第二次调用
fun()
时,变量x
被设置为10
。这与对同一函数的第一次调用无关。只是增加了已经说过的内容。第一个案例行为背后的原因是,它是一个静态变量,具有静态持续时间。静态持续时间意味着对象或变量在程序启动时分配,在程序结束时取消分配
这意味着,一旦第一种情况下的x
第一次用10
初始化,下一个函数调用将忽略静态int x=10
因为x
无法再次实例化,因为它已经被分配,只需继续返回x
,它将与main
中分配的30
相同x
,基本上,您的理解是正确的,除了在第二种情况下,您正在处理的局部变量的悬挂引用无效,这是未定义的行为,意味着一切都是可能的。您所说的只是其中一种可能性,它也可能导致其他情况,例如获取随机数、程序崩溃等
fun() = 30;