求教下有关于static的作用

brk1985 2011-07-06 02:15:30

#include <stdio.h>

int fun(void){
static int count = 10;//①事实上此赋值语句从来没有执行过???不是仅初始化一次吗?
return count--;
}

int count = 1;//②为什么全局count与static类型count不冲突?

int main(void)
{
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());

return 0;
}


求教下
事实上此赋值语句从来没有执行过???这句是不是讲错了?不是初始化过一次吗?调试的时候发现这条语句确实不执行。不知为什么?
②为什么全局count与static类型count不冲突?

static的作用
http://www.cnblogs.com/dc10101/archive/2007/08/22/865556.html
...全文
172 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
brk1985 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xrunning 的回复:]

晕,做了一个简单的测试,“static int count = 10;”这一句居然真的没有执行。看来赋值是常量的时候编译器就直接优化了,就如楼上的各位所说在编译阶段分配内存并初始化。
我测试过如果是“static int count = fun2();”这样的方式赋值就会在fun()第一次调用时执行。对不住楼上的诸位大大了。
[/Quote]

“static int count = fun2();”编译的时候应该也执行过一次,只是编译时fun2()返回值未知,因此运行时再执行一次。不知道这样的理解准确不?
brk1985 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xrunning 的回复:]

static int count = 10;语句确实是在fun()第一次调用的时候执行,楼上很多同学都说错了。
这个变量和全局变量count是两个完全不相干的变量,在fun()函数中全局变量count因重名被隐藏所以楼主的代码不会修改全局变量的值。
可以使用::count调用全局变量。
[/Quote]

理解了。。。fun()函数中全局变量count因重名被隐藏,因此静态count不会修改全局变量的值,也不会因为全局count值的改变而使得静态count值发生改变。本质上看,尽管变量名相同,两者却是两个完全不相干的变量。。。
brk1985 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chinazhangjie 的回复:]

C/C++ code

#include <stdio.h>
#include <iostream>
using namespace std;

class TestClass
{
public:
TestClass() { cout << "constructor !" << endl; }
};

int fun(void){
static TestClass tc;
……
[/Quote]

恩,构造函数只执行一次。。。
小时了了 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 brk1985 的回复:]

引用 16 楼 xrunning 的回复:

“static int count = fun2();”编译的时候应该也执行过一次,只是编译时fun2()返回值未知,因此运行时再执行一次。不知道这样的理解准确不?
[/Quote]
编译时执行的不是这句,是给静态变量分配空间并初始化(可能是0);你原来的代码中因为赋值的是常量,编译器就直接给初始化成10了,就省掉了后面执行的过程。
superwind 2011-07-07
  • 打赏
  • 举报
回复
1、静态变量在程序编译时就已经分配了地址空间并初始化了,因此在程序执行时不会再去初始化。
2、作用域差异,一个是局部作用域,一个是文件作用域,因此不冲突。
brk1985 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xudacheng06 的回复:]

①:static int count = 10 在你显式调用函数之前,count就已经初始化了
②:
int count=1;//是全局变量
int fun(void){
static int count = 10;//局部变量,在fun函数中,局部变量覆盖全局变量
return count--;
}
[/Quote]

不知道static int count = 10语句什么时候执行?调试的时候发现执行不到,直接跳过去了。。。
brk1985 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnuqinhuan 的回复:]

作用域不一样所以不冲突 static只是延长了变量的生命周期 等同于一个全局变量的生命周期 但是还是一个静态局部变量 静态变量只需要初始化一次 后面的都不会初始化
所以运行结果是
1 10
2 9
3 8
....
[/Quote]

static int count = 10;语句初始化 在什么时候执行?在“int count=1;”之后执行吧?fun函数里,static int count = 10;初始化一次后,不会覆盖全局变量count的值吗?怎么全局count和静态count两个变量似的,互不影响?很纳闷。。。
tongjm2009 2011-07-06
  • 打赏
  • 举报
回复
这个是我网上找的!

共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

tongjm2009 2011-07-06
  • 打赏
  • 举报
回复
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。
至善者善之敌 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]
额 你应该在fun里面打印出count的值看看,至于冲突,一个是全局变量,一个是局部静态变量。在fun里面局部静态变量会隐藏全局变量。
[/Quote]


+++1但实际编程中最好不要这样做。取名还是区分开好
独酌逸醉 2011-07-06
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <iostream>
using namespace std;

class TestClass
{
public:
TestClass() { cout << "constructor !" << endl; }
};

int fun(void){
static TestClass tc;
static int count = 10;

//①事实上此赋值语句从来没有执行过???不是仅初始化一次吗?
return count--;
}

int count = 1; // ②为什么全局count与static类型count不冲突?

int main(void)
{
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());

return 0;
}

输出结果为:

global local static
constructor !
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1
独酌逸醉 2011-07-06
  • 打赏
  • 举报
回复
(1)事实上此赋值语句从来没有执行过???不是仅初始化一次吗? 你可以换一个类的对象,看看构造函数什么时候执行就知道了。
(2)为什么全局count与static类型count不冲突? 它们的作用域不同,所以不会冲突。你可以看看《Effective C++》条款33:避免遮掩继承而来的名称(Avoid hiding inherited names)
xudacheng06 2011-07-06
  • 打赏
  • 举报
回复
①:static int count = 10 在你显式调用函数之前,count就已经初始化了
②:
int count=1;//是全局变量
int fun(void){
static int count = 10;//局部变量,在fun函数中,局部变量覆盖全局变量
return count--;
}

pengzhixi 2011-07-06
  • 打赏
  • 举报
回复
额 你应该在fun里面打印出count的值看看,至于冲突,一个是全局变量,一个是局部静态变量。在fun里面局部静态变量会隐藏全局变量。
無_1024 2011-07-06
  • 打赏
  • 举报
回复
作用域不一样所以不冲突 static只是延长了变量的生命周期 等同于一个全局变量的生命周期 但是还是一个静态局部变量 静态变量只需要初始化一次 后面的都不会初始化
所以运行结果是
1 10
2 9
3 8
....
序员 2011-07-06
  • 打赏
  • 举报
回复
fun里面的count当然不会和全局的count 冲突,
就算你不加static也一样。。。这应该是基本知识了。

static int count 作为一个全局变量,应该是编译器初始化了。。。(不知我说的对不对)
ljq550000 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]

额 你应该在fun里面打印出count的值看看,至于冲突,一个是全局变量,一个是局部静态变量。在fun里面局部静态变量会隐藏全局变量。
[/Quote]

顶下
管哥的天下 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnuqinhuan 的回复:]
作用域不一样所以不冲突 static只是延长了变量的生命周期 等同于一个全局变量的生命周期 但是还是一个静态局部变量 静态变量只需要初始化一次 后面的都不会初始化
所以运行结果是
1 10
2 9
3 8
....
[/Quote]
支持
小时了了 2011-07-06
  • 打赏
  • 举报
回复
晕,做了一个简单的测试,“static int count = 10;”这一句居然真的没有执行。看来赋值是常量的时候编译器就直接优化了,就如楼上的各位所说在编译阶段分配内存并初始化。
我测试过如果是“static int count = fun2();”这样的方式赋值就会在fun()第一次调用时执行。对不住楼上的诸位大大了。
小时了了 2011-07-06
  • 打赏
  • 举报
回复
static int count = 10;语句确实是在fun()第一次调用的时候执行,楼上很多同学都说错了。
这个变量和全局变量count是两个完全不相干的变量,在fun()函数中全局变量count因重名被隐藏所以楼主的代码不会修改全局变量的值。
可以使用::count调用全局变量。
加载更多回复(3)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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