分析一下结果

漁_夫 2010-08-20 07:54:33
static int j;
void fun1(void)
{
static int i = 0;
i ++;
}
void fun2(void)
{
j = 0;
j++;
}
int main()
{
int k;
for(k=0; k<10; k++)
{
fun1();
fun2();
}
return 0;
}

i,j结果?原因?
...全文
150 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovestefanie 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 damon1118 的回复:]
i = 10
j = 1
1.因为i是static类型,在固定地址上的分配,这意味着对象是在一个特殊的静态区域上创建的,而不是每次函数调用的时候在堆栈上动态创建的,所以只初始化一次,且在fun1中可见,即可进行修改,每次的修改都会覆盖原来的数据,所有程序结束static i才释放内存。
2.而i是auto的每次在函数fun1调用的时候才会给i分配……
[/Quote]
+1
damon1118 2010-08-24
  • 打赏
  • 举报
回复
i = 10
j = 1

1.因为i是static类型,在固定地址上的分配,这意味着对象是在一个特殊的静态区域上创建的,而不是每次函数调用的时候在堆栈上动态创建的,所以只初始化一次,且在fun1中可见,即可进行修改,每次的修改都会覆盖原来的数据,所有程序结束static i才释放内存。
2.而i是auto的每次在函数fun1调用的时候才会给i分配内存,再进行初始化,fun1中所有东西的生命周期结就是函数被调用的过程,当fun1调用结束,分配给fun1的所有内存全部释放,此时就没有fun1和它内部的的i了。
svtanto 2010-08-23
  • 打赏
  • 举报
回复
i = 10
j = 1
static int j;
声明j是个全局变量,但是对本文件以外是不可见的
static int i = 0;
声明i是个局部变量,但是是static的,第一次调用时候执行i=0,以后就不再执行i=0,每次只执行i++,也就是说:
1、初始化只能在定义的同时完成
2、初始化代码只在第一次进入函数时候运行一次,以后不再运行
眼睛猥琐男 2010-08-23
  • 打赏
  • 举报
回复
而fun2中 j = 0;不是初始化操作, for循环每次都把它执行一次。 两函数差别就在这里。
眼睛猥琐男 2010-08-23
  • 打赏
  • 举报
回复
很明显是10 和 1;

主要的一个点就是:静态变量仅被初始化一次!即fun1中 static int i = 0; 仅执行一次。

这样楼主应该好理解一点。
东大坡居士 2010-08-20
  • 打赏
  • 举报
回复
应该是i=10,J=1
njhsliliangx 2010-08-20
  • 打赏
  • 举报
回复
类似问题。可以自己把CODE在实际的运行一下。注意:加些输出信息。就知道多少,也会发现结果的原由
c4185 2010-08-20
  • 打赏
  • 举报
回复
i=10,j=1吧,是我搞反了?
wing_0706 2010-08-20
  • 打赏
  • 举报
回复
void fun2(void)
{
j = 0;
j++;
}
-----------
调用一次这个函数 就赋值成0 再 加加 所以 一直为 1

i就不一样了。。 那个不是赋值操作 那句初始化只 执行一次
wing_0706 2010-08-20
  • 打赏
  • 举报
回复
#include <stdio.h>
static int j; //这是全局的静态变量 默认初始为0吧
void fun1(void)
{
static int i = 0; //这是局部的静态变量 初始为0只在函数第一次调用时 初始为0 以后就不管这句了
i ++;

}
void fun2(void)
{
j = 0;
j++;
}
int main()
{
int k;
for(k=0; k<10; k++)
{
fun1();
fun2();
}
return 0;
}
wing_0706 2010-08-20
  • 打赏
  • 举报
回复
j 是 1
i 是 10

静态变量只初始化一次啊

69,371

社区成员

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

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