这是代码
int& fun(){
static int x = 10;
return x;
}
int main() {
fun() = 30;
cout<< fun();
getch();
}
输出为 30。这是如何工作的?
这是代码
int& fun(){
static int x = 10;
return x;
}
int main() {
fun() = 30;
cout<< fun();
getch();
}
输出为 30。这是如何工作的?
让我们逐行阅读:
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,一步步跟踪程序的执行:
$ 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) disp fun()
1: fun() = (int &) @0x60104c: 10
由于fun
返回对静态变量的引用,我可以在 GDB 中的每一步显示它的值。
(gdb) s
fun () at 1.cpp:6
6 return x;
1: fun() = (int &) @0x60104c: 10
运行一个步骤,我们看到我们在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
我们继续执行程序并离开 GDB(尽管您的问题已经得到解答)。
它很简单:fun
返回对函数内部变量的引用,该static
变量由以下行分配30
:
fun() = 30;
这意味着,x
函数内部更改为30
. 更?是30!fun()
您可以通过在下一行再次调用来打印它。
请注意,静态变量会一直存在到程序结束:即使函数返回,它也不会被销毁!
该fun
函数返回一个int
类型的引用。这样,当您调用时fun() = 30
,您实际上设置x
为 30。这样,当您打印出来时,fun
函数将不再设置它,因为这是一次性声明。