关于static的一点疑惑.

lufei145 2009-02-12 09:19:59
这样一段代码

#include <iostream>

using namespace std;

size_t count_calls()
{
static size_t ctr = 0;
return ++ctr;
}

int main ()
{
for(size_t i=0;i!=10;++i)
cout << count_calls() << endl;
return 0;
}

输出的结果是1到10.我知道ctr是在静态全局存储区,在程序运行结束前不会被撤销,但是每次调用count_calls() 都有ctr = 0;这样操作啊,不应该输出10个1吗?
...全文
75 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sagegz 2009-02-12
  • 打赏
  • 举报
回复
局部静态变量有时可以看做是全局变量,所以调用的时候也不会在count_calls()中重复初始化.你自己调试程序的时候也可以看到嘛!
wzg112 2009-02-12
  • 打赏
  • 举报
回复
静态变量声明只执行一次
dongpy 2009-02-12
  • 打赏
  • 举报
回复
static size_t ctr = 0;
这个静态变量在程序装载时就初始化好了,函数count_calls()里不会执行初始化操作。
OenAuth.Core 2009-02-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hairetz 的回复:]
静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

你这里
size_t count_calls()
{
static size_t ctr = 0;
return ++ctr;
}
因为函数count_calls()里声明了静态变量static size_t ctr = 0;那么第二次调用该函数时就不会再执行变量的声明,从return ++ctr;开始执行。所以结果…
[/Quote]


当第二次执行该函数时,系统发现已经存在了ctr,那就不会再去定义了。,所以出现1-10
  • 打赏
  • 举报
回复

#include <iostream>

using namespace std;

size_t count_calls()
{
static size_t ctr ;
ctr = 0; //声明与定义分开
return ++ctr;
}

int main ()
{
for(size_t i=0;i!=10;++i)
cout << count_calls() << endl;
return 0;
}



这样应该是你要的结果了。
  • 打赏
  • 举报
回复
静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

你这里
size_t count_calls()
{
static size_t ctr = 0;
return ++ctr;
}
因为函数count_calls()里声明了静态变量static size_t ctr = 0;那么第二次调用该函数时就不会再执行变量的声明,从return ++ctr;开始执行。所以结果是1到10咯。


cattycat 2009-02-12
  • 打赏
  • 举报
回复
count_calls() 函数中有static size_t ctr = 0;以后每次进入该函数,ctr初始化的值使用该函数上次退出时候的ctr的值。
qzl123666 2009-02-12
  • 打赏
  • 举报
回复
它只初始化一次,因为它是静态的变量
yellowhwb 2009-02-12
  • 打赏
  • 举报
回复
static的初始化动作只会被执行一次,一般编译器都把static变量初始化为0

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧