变量的生存周期解决方法
变量的生存周期for(int i0i10i++){ int j ....}小弟有一处不明,就是这里的变量j,如果循环执行了多次,
变量的生存周期
for(int i=0;i<10;i++)
{
int j;
....
}
小弟有一处不明,就是这里的变量j,如果循环执行了多次,那么每次是否都要重新定义j,还是第一次定义了,以后会跳过这句;如果每次都要定义,那么他们是不是拥有同一块内存.
[最优解释]
不存在重新定义!
定义是针对编译器而言,执行的时候哪来的定义?
这里只有一个定义。而且 j 所占的内存也只分配了一次。
[其他解释]局部非static变量,每次循环都定义
内存未必是同一块,可以打印看看
[其他解释]一楼正解
[其他解释]是不是同一块内存由编译器而定,我们也不必关心。关心就坏了,容易写出与实现相关的代码,失去了可移植性。
for(int i=0;i<10;i++)
{
int j;//一般的,这句不是执行语句,无所谓跳过与否
....
}
for(int i=0;i<10;i++)
{
int j = 0;//初始化,每次循环都会执行。
....
}
[其他解释]不存在几次定义的说法。j只有一个定义。编译后,执行时,只涉及为已定义的变量分配内存的问题,不涉及定义的问题。其它的楼上都说了。
[其他解释]和编译器有关,如果编译器优化过,应该就是同一段地址,但其实还是定义了多次。
不必太纠结这种细节。
[其他解释]每次重新定义,否则就要定义static类型了。
[其他解释]逻辑上重新定义,但实际底层的细节不是你我操心的事情,不要依赖底层是否为同一块内存。
[其他解释]???
[其他解释]如果j 是对象,他的构造函数和析构函数都被调用了10次
[其他解释]这个变量j,比如每次定义分别为j0,j1,j2,j3,每次定义的时候,虽然重新定义了,但使用的变量地址 其实是一样的。
for(int i=0;i<10;i++)
{
int j;
printf("%p",j);
....
}
按理每次打印出来的j的地址是不一样的,但编译器优化了,就是一样的了。
[其他解释]+1
[其他解释]这能叫优化吗。只是分配到那里了,不见得“优”在哪。
[其他解释]重新定义。
每次都不是同一内存。
你可以
cout << &j << endl;
看看。
[其他解释]我这里是说可以优化,编译器级别的,可又不是一定会优化,不同的编译器表现不一样。
[其他解释]少拿优化乱说事,先把基本概念搞清楚。此例的整个循环都在一个栈帧里,局部变量根本不会被重新分配内存,哪来的地址变化之说?