-6

这是代码

int& fun(){
    static int x = 10;
    return x;
}

int main() {

    fun() = 30;

    cout<< fun();

    getch();
}

输出为 30。这是如何工作的?

4

3 回答 3

11

让我们逐行阅读:

int& fun()

声明一个名为的函数,该函数fun返回对整数变量的引用

{
    static int x = 10;

x变量在此函数内是静态的。为它保留了内存中的一个特殊位置,并用 初始化10。每次调用此函数时,x都会获取存储在该特殊位置的值。

    return x;
}

我们返回x并离开函数。让我们来看main一个:

int main()
{
    fun() = 30;

请记住,它fun返回对 int 的引用。这里我们将整数修改为30。由于这个整数有分配,从现在开始static每次都会被调用,除非进行其他更改。funx30

    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(尽管您的问题已经得到解答)。

于 2013-08-07T12:32:14.137 回答
6

它很简单:fun返回对函数内部变量的引用,该static变量由以下行分配30

fun() = 30;

这意味着,x函数内部更改为30. 更?是30!fun()您可以通过在下一行再次调用来打印它。

请注意,静态变量会一直存在到程序结束:即使函数返回,它也不会被销毁!

于 2013-08-07T12:25:14.820 回答
0

fun函数返回一个int类型的引用。这样,当您调用时fun() = 30,您实际上设置x为 30。这样,当您打印出来时,fun函数将不再设置它,因为这是一次性声明。

于 2013-08-07T12:27:43.540 回答