Col*_*lor 1 c++ debugging loops
我正在使用Robert Lafore的书(OOP with C++)学习C++.在本书中,我遇到了这个例子:
#include <iostream>
#include <conio.h>
using namespace std;
void main ()
{
int numb;
for ( numb = 1 ; numb <= 10 ; numb++ )
{
cout << setw(4) << numb;
int cube = numb*numb*numb;
cout << setw(6) << cube << endl;
}
getch();
}
Run Code Online (Sandbox Code Playgroud)
变量'cube'已在循环体内声明为int'.
int cube = numb*numb*numb;
Run Code Online (Sandbox Code Playgroud)
由于循环迭代10次,变量'cube'也将被声明10次.无论迭代次数如何,'cube'都可以在循环体内访问.所以,当我们进入第二次迭代的循环体时,'cube'已经知道了(因为它已经在第一次迭代中声明了),而'cube'的另一个声明应该给出"重新定义"的错误.但相反,它成功构建并调试没有问题.为什么?
Jos*_*eld 15
自动变量(例如cube)的范围是声明它的块.cube声明的块是for循环体.在每次迭代结束时,cube变量超出范围,下一次迭代开始,然后cube再次引入范围.从逻辑上讲,没有冲突,因为cube在同一范围内不存在两个标识符- 实际上,只有一个声明cube.
可能值得区分变量的声明和由于该声明而创建的对象.只有一个声明int cube = ...;.可以多次访问这段代码并不重要; 它仍然只有一个声明.语言规则说你不能在同一范围内声明两个具有相同名称的变量,但这没关系,因为你只声明了一次.这是一个完全静态的规则,您的编译器可以分析.
只是因为你的for循环,你的声明达到了10次,这意味着int将创建10个对象.由于变量的范围,它们不会同时存在.这不是程序的静态属性.编译器通常不能事先知道将达到一行代码的次数.
当你第二次进入循环时,第一次cube超出了范围,所以一切正常.
两个cubes在同一范围内将是一个问题:
{
int cube = 0;
int cube = 1;
}
Run Code Online (Sandbox Code Playgroud)
您已经发现了"自动存储持续时间".
变量cube在循环内声明.特别是,在循环的块范围内.在循环结束时,这个变量将被销毁,就像在任何块作用域中声明的任何变量一样,无论是函数,循环,if/else块,还是只能在任何地方声明的原始块作用域代码使用{和},即:
int main(){
//Beginning of block
{
int cube = 1;
//cube exists and is declared here
}//End of block
//cube is gone here
return 0;
}
Run Code Online (Sandbox Code Playgroud)
事实上,循环的每次迭代都将拥有全新的cube变量.
该变量cube仅在for循环体内使用.我不确定说它被声明十次是正确的(声明,实际上是你的情况下的定义,是源代码的语法和静态文本部分).
在C++中,您可以(并且经常这样做)拥有具有局部变量的块.它的cube起始范围是声明,并在包含块的末尾结束(大括号{...... }).
如果已定义变量的类型具有构造函数,则在定义点处调用它.如果该类型具有析构函数,则在块的末尾概念性地调用它(比喻,在结束之前}......).
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |