这是代码
int& fun(){
static int x = 10;
return x;
}
int main() {
fun() = 30;
cout<< fun();
getch();
}
输出为30。 这是如何工作的?
答案 0 :(得分:10)
让我们逐行阅读:
int& fun()
声明一个名为fun
的函数,它将引用返回给整数变量
{
static int x = 10;
x
变量在此函数中是静态的。内存中的特殊位置是为它保留的,并使用10
进行初始化。每次调用此函数时,x
都会获得存储在该特殊位置的值。
return x;
}
我们返回x
并退出该功能。我们转到main
:
int main()
{
fun() = 30;
请记住fun
返回对int的引用。这里我们将整数修改为30
。由于从static
开始fun
,从x
开始30
每次调用此分配均为 cout<< fun();
,除非进行其他更改。
x
由于30
是 getch();
}
,这就是你得到的。
$ gdb ./a.out
(gdb) b main
Breakpoint 1 at 0x40077b: file 1.cpp, line 11.
(gdb) r
Starting program: /tmp/a.out
Breakpoint 1, main () at 1.cpp:11
11 fun() = 30;
建议:使用GDB并逐步跟踪程序的执行:
main
我们启动GDB,在(gdb) disp fun()
1: fun() = (int &) @0x60104c: 10
的开头设置断点并启动程序。
fun
由于(gdb) s
fun () at 1.cpp:6
6 return x;
1: fun() = (int &) @0x60104c: 10
返回对静态变量的引用,我可以在GDB的每一步显示它的值。
func
单步执行我们就会看到我们在x
。这是归档30
(gdb) n
7 }
1: fun() = (int &) @0x60104c: 30
的地方(作为参考)。
x
确实,在离开该功能后,30
为(gdb)
main () at 1.cpp:13
13 cout<< fun();
1: fun() = (int &) @0x60104c: 30
(gdb) s
fun () at 1.cpp:6
6 return x;
1: fun() = (int &) @0x60104c: 30
(gdb)
7 }
1: fun() = (int &) @0x60104c: 30
(gdb)
main () at 1.cpp:15
15 }
1: fun() = (int &) @0x60104c: 30
(gdb) q
。
{{1}}
我们继续执行程序并离开GDB(尽管您的问题已经得到解答)。
答案 1 :(得分:6)
这很简单:fun
将引用返回到函数内的static
变量,该变量由此行分配给30
:
fun() = 30;
这意味着,函数内的x
更改为30
。更?这是30!您可以在下一行再次调用fun()
进行打印。
请注意,静态变量一直持续到程序结束:即使函数返回它也不会被破坏!
答案 2 :(得分:0)
fun
函数返回对int
类型的引用。这样,当您致电fun() = 30
时,实际上将x
设置为30。
这样当你打印出来时,fun
函数将不再设置它,因为这是一次性声明。