循环中的对象创建与初始化

饶鹏 2008-03-14 10:11:04
循环中的对象创建(分配内存)只有一次,这应该没有疑问。
对于初始化,我以前也一直以为只有一次。可试了之后才知道,如果是临时变量,则循环多少次就赋值多少次;如果是静态变量,则只赋值一次。这是为什么?
谁能总结一下循环中的对象创建与初始化的规律?
(好像就算用goto跳过了任何对象的创建,该对象还是会被创建?)


int a = 100;
int b = 0;

for (int i = 0; i < a; ++i)
{
int j = b;
++b;
printf("%d ",j);
}


结果:0 1 2 3...直到99


int a = 100;
int b = 0;

for (int i = 0; i < a; ++i)
{
static int j = b;
++b;
printf("%d ",j);
}


结果:0 0 0 0...

...全文
134 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
paidfighting 2008-03-15
  • 打赏
  • 举报
回复
上面几位正解
只是建议lz使用“局部变量”的说法,临时变量实际上是另外一种变量

找一本好的参考书,查 “局部变量 静态变量 作用域”

这些是语言特性,lz何须自己总结,利用参考书。。。
就是这个怪兽 2008-03-15
  • 打赏
  • 举报
回复
临时变量在所属的代码段结束时便销毁.
{ // 代码段开始
int j = b; // 新变量j
++b;
printf("%d ",j);
} // 代码段结束,j被销毁

静态变量存入于堆中,代码段结束不销毁
{ // 代码段开始
static int j = b; // 静态变量j,存入于堆中,代码段结束不销毁
++b;
printf("%d ",j);
}

paidfighting 2008-03-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fenghou1st 的回复:]
我一直以为i和j在一个作用域,所以以为循环语句的作用域从i那里开始。
现在看来循环语句其实有两个作用域?不知道没有花括号的话,会不会变成一个?
[/Quote]

局部变量的作用域是包括该变量声明的最内层花括号
饶鹏 2008-03-15
  • 打赏
  • 举报
回复
我一直以为i和j在一个作用域,所以以为循环语句的作用域从i那里开始。
现在看来循环语句其实有两个作用域?不知道没有花括号的话,会不会变成一个?
饶鹏 2008-03-14
  • 打赏
  • 举报
回复
是不是说,在临时变量的情况下(没有static),该对象被创建了n次?
就是说j和i不一样,i可以在整个循环过程中都存在,而j只是在本次循环中存在?
taodm 2008-03-14
  • 打赏
  • 举报
回复
for (int i = 0; i < a; ++i)
{
{
int j = b;
++b;
printf("%d ",j);
}
}
再想想这段代码吧
taodm 2008-03-14
  • 打赏
  • 举报
回复
你为什么不反过来根据结果推规则呢?
每调用一次构造函数就表明创造了一个新对象。
hastings 2008-03-14
  • 打赏
  • 举报
回复
int a = 100;
int b = 0;

for (int i = 0; i < a; ++i)
{
static int j = b;//i>0后,这句就相当于注释掉了.
++b;
printf("%d ",j);
}
hastings 2008-03-14
  • 打赏
  • 举报
回复
static只初始化一次.这是规矩.哈
qiuqiu173 2008-03-14
  • 打赏
  • 举报
回复
因为静态变量是放在堆里的
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-14 10:11
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下