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

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

大家解释解释吧。


...全文
226 点赞 收藏 17
写回复
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不是一个啊, 它们的作用域不同,。而且互不影响
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告