因为C++里面,相同名字的变量在【不同的作用域】里面,是可以重复声明的。
注:每一对"{}"就是一个作用域。
比如下面的程序是可以编译通过的:
#include
usingnamespacestd;
intmain(intargc,char*argv[])
//作用域1开始
{
inta=1;
//作用域2开始
{
cout< inta=2;
//作用域3开始
{
cout< inta=3;
//作用域4开始
{
cout< inta=4;
cout< }
}
}
return0;
}
输出结果为:
1
2
3
4
--------------------------------------------------------------------------------
如果【没有】规定“所有用到的变量要先定义后使用”,上面的程序会怎么样呢?
那么上面这个程序就乱套了。因为可以先使用,再定义,
输出语句1~4就不知道自己该用哪个变量a了(这里有4个不同的a)。
因为不需要“先定义,后使用”,输出语句1~4可以使用定义在任何地方的哪个变量a。
这样,编译器就无法确定,也就无法编译了。
--------------------------------------------------------------------------------
如果规定“所有用到的变量要先定义后使用”,上面的程序会怎么样呢?
那么上面这个程序可以正常运行:
1)在输出语句1的位置为止,只有【作用域1】定义了一个a:inta=1,因此输出1。
2)在输出语句2的位置为止,【作用域1】和【作用域2】分别定义了一个a:
inta=1;
inta=2;
根据就近原则,使用最内层作用域的a,【作用域2】里面的a,输出2;
3)在输出语句3的位置为止,【作用域1】【作用域2】和【作用域3】分别定义了一个a:
inta=1;
inta=2;
inta=3;
根据就近原则,使用最内层作用域的a,【作用域3】里面的a,输出3;
同理可以分析输出语句4。
这就是为什么规定“所有用到的变量要先定义后使用”的原因之一吧。