C++局部变量问题

来源:百度知道 编辑:UC知道 时间:2024/05/26 14:03:17
#include<iostream>
using namespace std;
static int value = 4;
void fun1(int i)
{
static int value = i;

cout<<value<<" \n";
cout<<&value<<endl;
}
void fun2(int i)
{
static int value = i;

cout<<value<< " \n";
cout<<&value<<endl;
}

void fun3(int i)
{
static int value = i;

cout<<value<<" \n";
cout<<&value<<endl;
}
int main()
{
fun1(1);
fun1(2);
fun2(2);
fun3(3);
cout<<value<< " \n";
cout<<&value<<endl;
return 0;
}
最后输出是:
1
00419520
1
00419520
2
00419528
3
00419514
4
00419020
我想问的是fun1(1)fun(2)为什么value还是1呢,还有大家调试一下,一步一步的来,发现当跳出函数fun1()时,上面所有的value的值都是4,进入fun1()时上面所有的value

1.
static int value = 4; 的作用域为整个文件.
调试,跳出函数fun1()时,函数里面的value,在运行时看来,其生命周期结束了,
于是,调试器显示的value都表示:最外层的value == 4.

2.
注意,在函数内部定义的静态变量,比如:
void fun1(int i)
{
static int value = i; // 首次调用,通常可以赋值为1
i++; // 调用计数
cout<<value<<" \n";
cout<<&value<<endl;
}
在程序的一次运行当中,
其中value只在首次调用时,被初始化赋值一次,下次调用fun1(2),不再改变它的静态值,除非在函数内部对它改动.
这个局部的静态变量,通常用来进行调用计数,如上代码所示.

这个是变量作用域和静态变量的问题

1.
函数内和函数外如果有两个相同名称的变量,则函数内里赋的值将屏蔽函数外的值,而且函数内定义的变量只在本函数内有效.
2.
静态变量只初始化一次,在之后赋的值都不能造成影响.

比如解释这个例子:
fun1(1);
//显示1,因为对静态局部变量初始化为1
fun1(2);
//显示1,静态局部变量只初始化一次
fun2(2);
//显示2,在另一个函数里,实际上是另一个变量value,和函数fun1()里的value作用域不同.本作用域里初始化为2
fun3(3);
//显示3,原因同fun2(2),在fun3()里初始化为3
最后cout的value是指所有函数外面的那个全局变量.所以为4

两个函数的值都为1,是因为static int value = i;你把静态局部变量的定义和赋值写在一起了,当第二次调用此函数时,不会再执行定义的语句,当然你的赋值也就不