读书人

C++作用域有关问题

发布时间: 2013-03-10 09:38:39 作者: rapoo

C++作用域问题


#include<iostream>
using namespace std;
#define LENGTH 100
int main()
{
int N;
int num;
while (cin >> N) {
int a[LENGTH];
for (int i = 0; i < LENGTH; i++)
a[i] = 0;
for (int i = 0; i < N; i++) {
cin >> num;
a[num]++;
}
for (int i = 0; i < LENGTH; i++) {
if (a[i] % 2 == 1) {
cout << i << endl;
break;
}
}
}
return 0;
}

输入1:
3
1 2 1
输入2:
5
7 7 7 7 3
我在跟踪调试时发现执行完输入1到while(cin >> N)这一行,我在命令行窗口输入5,然后回车,发现程序跳过了int a[LENGTH]这一行,没有重新声明一个数组,而是继续使用输入1使用过的数组。按照C++的块作用域规则,数组a是局部变量,每次执行while循环体的时候,都要重新创建一个新的数组才对啊,请问出现我描述的这种情况是什么原因呢?请高手解释一下,谢谢!
[解决办法]
a作用域仅在循环体内部没错,每次循环也确实是重新创建了一个新的数组,只是恰巧新数组的地址与之前的a数组重合了(或者说这不是巧合而是几乎都是这种情况),加上这之间没什么干扰a数组的内容没有变化,所以LZ有了这种感觉。要知道创建局部数组时是连初始化都没有的。如果将a的定义换成
MyArray a;
其中MyArray是自己实现的数组类,那就能看到每次循环都要跑一遍构造和析构函数了。
[解决办法]
函数参数与内部的局部变量,全部是在"栈"中申请的。
当你的程序进入到函数可见的C\C++代码时,其栈空间全部搭建完毕。
如果你只是在函数内部声明一个变量,并且在此变量处设置断点。
因为此变量空间已经在函数可见的C\C++代码外部创建完毕。
所以此变量声明处不会产生对应的汇编代码,如果一条语句没有对应的汇编代码。
那么IDE是无法为你设置断点的,所以你断不下来。
你可以在此函数别处设置断点,当命中此断点时,查看反汇编代码。
你可以看到函数内部只有声明的局部变量是不会产生汇编语句的。

这个问题涉及了一点点汇编知识,如果你能杀下心来学习一点汇编知识,
那对你理解C\C++的好处是巨大的。

读书人网 >C++

热点推荐