都来解释这个结果吧,能学到一些。

ylc3895_cn 2005-03-17 04:55:31

#include<iostream.h>
void main(){
int i=12;
for(;i>0;i/=3)
{
cout<<i<<',';
static int i=6;
cout<<++i<<endl;
}
cout<<i<<endl;
cin.get();
}

输出结果:
12,7
4,8
1,9
0

大家解释解释吧。


...全文
245 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lx1986 2005-03-18
  • 打赏
  • 举报
回复
它只执行3次呀
第一次i=12
第二次i=4
第三次i=1
知道了吗?
weigoal 2005-03-18
  • 打赏
  • 举报
回复
原来如此
cxyol 2005-03-18
  • 打赏
  • 举报
回复
mark
tttl366 2005-03-18
  • 打赏
  • 举报
回复
弱弱的问一句,为什么结果不是:
输出结果:
12,7
4,8
1,9
0,10
0
stonesstar 2005-03-18
  • 打赏
  • 举报
回复
顶楼上的
shine51151 2005-03-18
  • 打赏
  • 举报
回复
re: 楼上的兄弟 xialin168(林)

你首先要弄清楚以下几点:

(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

(3)虽然离开定义静态局部变量的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。(所以再次调用i时它的值不恢复为6)


(4)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。

(5)静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。(所以静态局部变量i不算重复声明;若i为自动变量,则当调用它时i就存在,执行完cout<<++i<<endl;i就消失了,当再次执行int i=6;时相当于又重新定义了一个新的自动变量i)

(6)如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。








xialin168 2005-03-18
  • 打赏
  • 举报
回复
static int i=6;
为什么每次迭代i不恢复为6;
还有就是每次迭代都对i进行声明,不是不能重复声明一个变量的吗?
GeminiXXXCC 2005-03-17
  • 打赏
  • 举报
回复
static 是能解决命名冲突的工具!

不知道 yc0188(守护瓶(萍)) 是如何从这个程序得出这个结论的?
如果没有static,程序输出是
12,7
4,7
1,7
0
没有什么名字冲突啊。
不过个人反对这样的代码。
showlie 2005-03-17
  • 打赏
  • 举报
回复
只要概念清楚没什么难的。
1.变量作用域
2.静态变量的持久性
ZDL627 2005-03-17
  • 打赏
  • 举报
回复
学到了 
MARK~~
laZZe 2005-03-17
  • 打赏
  • 举报
回复
顶楼上的,是变量的作用域和可见性问题。
mark~~
yuchengliu 2005-03-17
  • 打赏
  • 举报
回复
static 是能解决命名冲突的工具!

#include<iostream.h>
void main(){
int i=12;
for(;i>0;i/=3) //i作用域开始
{
cout<<i<<',';
static int i=6;//static int 声明开始
cout<<++i<<endl;
} //结束
cout<<i<<endl;
cin.get();
} //结束

输出结果:
12,7 ------7是static
4,8
1,9
0
skywgs 2005-03-17
  • 打赏
  • 举报
回复
12,4,1,0是第一个i的,7,8,9是第二个i的,虽第二个i是static,但只能在for里用。
L_BOY 2005-03-17
  • 打赏
  • 举报
回复
void main(){
int i=12;
for(;i>0;i/=3)
{
cout<<i<<','; //int i=12中的i
static int i=6; //int i=12中的i不可见,
cout<<++i<<endl; //static int i=6中的i,
}
cout<<i<<endl;
cin.get();
}

我想这样大家都清楚了吧
kobefly 2005-03-17
  • 打赏
  • 举报
回复
这个
。。。。。。。。。。。。。。。。
healer_kx 2005-03-17
  • 打赏
  • 举报
回复
这两个i不是一个啊, 它们的作用域不同,。而且互不影响

64,636

社区成员

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

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