这个c ++代码是如何工作的

时间:2013-08-07 12:24:07

标签: c++

这是代码

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

int main() {

    fun() = 30;

    cout<< fun();

    getch();
}

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

3 个答案:

答案 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函数将不再设置它,因为这是一次性声明。