首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

变量的生存周期解决方法

2012-12-28 
变量的生存周期for(int i0i10i++){ int j ....}小弟有一处不明,就是这里的变量j,如果循环执行了多次,

变量的生存周期
for(int i=0;i<10;i++)
{
 int j;
 ....
}
小弟有一处不明,就是这里的变量j,如果循环执行了多次,那么每次是否都要重新定义j,还是第一次定义了,以后会跳过这句;如果每次都要定义,那么他们是不是拥有同一块内存.
[最优解释]

引用:
重新定义。
每次都不是同一内存。
你可以
cout << &amp;j << endl;
看看。


引用:
这个变量j,比如每次定义分别为j0,j1,j2,j3,每次定义的时候,虽然重新定义了,但使用的变量地址 其实是一样的。
for(int i=0;i<10;i++)
{
 int j;
 printf("%p",j);
 ....
}
按理每次打印出来的j的地址是不一样的,但编译器优化了,就是一样的了。


不存在重新定义!

定义是针对编译器而言,执行的时候哪来的定义?

这里只有一个定义。而且 j 所占的内存也只分配了一次。
[其他解释]
局部非static变量,每次循环都定义
内存未必是同一块,可以打印看看
[其他解释]
引用:
局部非static变量,每次循环都定义
内存未必是同一块,可以打印看看

一楼正解
[其他解释]
是不是同一块内存由编译器而定,我们也不必关心。关心就坏了,容易写出与实现相关的代码,失去了可移植性。

for(int i=0;i<10;i++)
 {
  int j;//一般的,这句不是执行语句,无所谓跳过与否
  ....
 }

 for(int i=0;i<10;i++)
 {
  int j = 0;//初始化,每次循环都会执行。 
  ....
 }

[其他解释]
引用:
for(int i=0;i<10;i++)
{
 int j;
 ....
}
小弟有一处不明,就是这里的变量j,如果循环执行了多次,那么每次是否都要重新定义j,还是第一次定义了,以后会跳过这句;如果每次都要定义,那么他们是不是拥有同一块内存.


不存在几次定义的说法。j只有一个定义。编译后,执行时,只涉及为已定义的变量分配内存的问题,不涉及定义的问题。其它的楼上都说了。
[其他解释]
和编译器有关,如果编译器优化过,应该就是同一段地址,但其实还是定义了多次。
不必太纠结这种细节。
[其他解释]
每次重新定义,否则就要定义static类型了。
[其他解释]
逻辑上重新定义,但实际底层的细节不是你我操心的事情,不要依赖底层是否为同一块内存。

[其他解释]
引用:
和编译器有关,如果编译器优化过,应该就是同一段地址,但其实还是定义了多次。
不必太纠结这种细节。


???
[其他解释]
如果j 是对象,他的构造函数和析构函数都被调用了10次
[其他解释]
这个变量j,比如每次定义分别为j0,j1,j2,j3,每次定义的时候,虽然重新定义了,但使用的变量地址 其实是一样的。
for(int i=0;i<10;i++)
{
 int j;
 printf("%p",j);
 ....
}
按理每次打印出来的j的地址是不一样的,但编译器优化了,就是一样的了。

引用:
引用:和编译器有关,如果编译器优化过,应该就是同一段地址,但其实还是定义了多次。
不必太纠结这种细节。

???

[其他解释]
引用:
引用:局部非static变量,每次循环都定义
内存未必是同一块,可以打印看看
一楼正解


+1
[其他解释]
引用:
这个变量j,比如每次定义分别为j0,j1,j2,j3,每次定义的时候,虽然重新定义了,但使用的变量地址 其实是一样的。
for(int i=0;i<10;i++)


{
 int j;
 printf("%p",j);
 ....
}
按理每次打印出来的j的地址是不一样的,但编译器优化了,就是一样的了。

引用:引用 5 楼 w……


这能叫优化吗。只是分配到那里了,不见得“优”在哪。
[其他解释]
重新定义。
每次都不是同一内存。
你可以
cout << &j << endl;
看看。
[其他解释]
我这里是说可以优化,编译器级别的,可又不是一定会优化,不同的编译器表现不一样。


引用:
引用:重新定义。
每次都不是同一内存。
你可以
cout << &amp;amp;j << endl;
看看。

引用:这个变量j,比如每次定义分别为j0,j1,j2,j3,每次定义的时候,虽然重新定义了,但使用的变量地址 其实是一样的。
for(int i=0;i<10;i++)
……

[其他解释]
引用:
我这里是说可以优化,编译器级别的,可又不是一定会优化,不同的编译器表现不一样。


少拿优化乱说事,先把基本概念搞清楚。此例的整个循环都在一个栈帧里,局部变量根本不会被重新分配内存,哪来的地址变化之说?

热点排行