C语言static 学习研究,答对了绝对给分!

wintree 2011-03-23 08:43:47
先看下这段代码

#include "stdafx.h"
#include <iostream.h>
using namespace std;
static int j;

void F1(void)
{
static int i=0;
i++;
cout<<i;
}
void F2(void)
{
j=0;
j++;
cout<<j;
}
int _tmain(int argc, _TCHAR* argv[])
{
int m;
for(m=0;m<10;m++)
{
F1();

F2();
cout<<"\n";
}
}



本代码是在vs下跑的。
静态全局变量只能作用于本文件总,其他文件即使是external 都应用不了的。想要使用就得在前面再加extern ***(看某人的一本书得到的。)

静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他
函数也用不了。由于被static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结
束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值

这时候,i 和j 的值分别是什么,为什么?

请大家打出来啊。答对了,我给分啊!!顺便高手对这个程序说一下改进哈
...全文
2926 86 打赏 收藏 转发到动态 举报
写回复
用AI写文章
86 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhilong123 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 elegant87 的回复:]

引用 25 楼 vicozo 的回复:
11
21
31
41
51
61
71
81
91
101
函数内部静态static变量只初始化一次,下次调用就直接用前面一次的值,所以结果依次递增
另外,你虽然定义了全局的静态变量j,但是他被函数内部定义的j给屏蔽了,所以结果一直是1

正解
[/Quote]


楼主不要瞎顶。不管全局还是局部static变量都只初始化一次,j=0是赋值而不是初始化,全局static j在static int j时便已在全局区初始化。
shpanghao 2011-03-28
  • 打赏
  • 举报
回复
楼主这个问题是让大家找自信的吧
wjmde678 2011-03-28
  • 打赏
  • 举报
回复
请看14楼,那就是答案。
yvhkfei 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ljt3969636 的回复:]
static int i=0 static变量初始化只会执行一次。
j=0;复制次次执行
[/Quote]
没错
xzjxylophone 2011-03-28
  • 打赏
  • 举报
回复
首先我希望楼主能区分 C语言和C++

我想楼主的代码不是纯C语言的,应该是C++的
因为该文件的扩展名肯定是cpp=而非c。(我刚才试了在c文件中无法使用using namespace std;)

static在C语言中有3中意思
修饰变量(函数外),表示局部的静态变量,只作用在本文件中
修饰变量(函数里),只用在本函数中,并且,当函数结束的时候,该变量不会被销毁,等下次调用的时候保持上一次的结果
修饰函数,表示只在本文件中能访问


C++中static除了上述3中意思外,多了另外一种意思:
修饰类成员的变量,表示所有该类的对象共用该一个变量。

关于static 修饰类

请看:
http://topic.csdn.net/t/20050428/09/3972544.html
abc173620913 2011-03-28
  • 打赏
  • 举报
回复
11
21
31
41
51
61
71
81
91
101
happypeipei1218 2011-03-28
  • 打赏
  • 举报
回复
11
21
31
41
51
61
71
81
91
101
wincesh 2011-03-28
  • 打赏
  • 举报
回复
TUXONE是一款分布式交易中间件,同ORACLE TUXEDO API级别兼容。您的现有ORACLE TUXEDO应用不需要修改任何代码,只要在TUXONE平台环境下重新编译,就可以平滑迁移至TUXONE平台。
wrongrun 2011-03-27
  • 打赏
  • 举报
回复
怎么这么复杂啊!!!!!
ding2006 2011-03-27
  • 打赏
  • 举报
回复
在函数中的静态变量只会被初始化一次,也就是static int i=0;只会在函数第一次调用时执行,往后该函数的调用就不会执行static int i=0了,另外静态变量的生命周期是在整个程序运行过程中,你可以参考一下这篇文章,关于变量的生命周期和作用域http://blog.csdn.net/yunyun1886358/archive/2010/05/29/5632087.aspx。
fred91 2011-03-27
  • 打赏
  • 举报
回复
不懂... 这不是C++ 入门内容吗,有什么好讨论的
一眼万里*e 2011-03-27
  • 打赏
  • 举报
回复
i从1……到10,递增
j等于1
itsmeaningless 2011-03-27
  • 打赏
  • 举报
回复
关于static关键字修饰的变量, 不管是出现在函数内还是函数外, 本质上都没有什么区别: 它们都存在于执行码的数据段(所以它们都只会别初始化一次), 在编译过程中都不会添加到符号表中, 未被添加的符号表中的符号, 如果在别的文件中引用, 在链接的过程中都会报错"符号未找到"(这一点对于static修饰的函数而言也是一样的)
dcw0402 2011-03-26
  • 打赏
  • 举报
回复
长命,有做用域访问限制.
qdyqdyqdy 2011-03-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dahzg 的回复:]
在F1中 static int i=0;这句将只执行一次(静态变量只初始化一次),然后输出的依次为1,2,3, 4, 5,6 ,7, 8 ,9 ,10
而j= 0 将反复被执行,输入将一直为1
输出效果就是:
1
1
2
1
3
1
4
。。。
9
1
[/Quote]
很对哦,局部变量有记忆性
xiewenbin1987 2011-03-26
  • 打赏
  • 举报
回复
i: 从1到10变化
j: 一直输出1
Yingmg 2011-03-26
  • 打赏
  • 举报
回复
你的主函数还没有返回呢,for循环这样写更好 for(int m=0; m<10; ++m)
lilonglin 2011-03-26
  • 打赏
  • 举报
回复
这样的题也值50分? 标题党吧
tangxianghenggood 2011-03-26
  • 打赏
  • 举报
回复
还在纠结、、、、、、、、、
Tiger-3D 2011-03-26
  • 打赏
  • 举报
回复
得了,该楼的高度已达到法定限度,请立刻封顶!
加载更多回复(59)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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