该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
深度解析:
C语言中有“作用域”的概念。譬如全局变量作用域为整个文件(准确的说是定义该全局变量的文件中该变量定义/声明之后的部分。只不过一般情况下全局变量都在文件头部定义,因此说全局变量为文件作用域。),局部变量为代码块作用域。
所谓代码块作用域,代码块是指用一对大括号{}括起来的部分(譬如一个函数的函数体,for循环的循环体等)。也就是说局部变量的作用域其实是定义这个局部变量的代码块中该变量定义体之后的部分。
这样看来,至少得到以下两个结论:
l 变量的作用域是有大有小的
l 变量的作用域是有重叠部分的。譬如在一个函数内,该函数的局部变量和整个文件的全局变量都覆盖这个作用域,这就是作用域的重叠。
重叠作用域中,如果全局变量名和局部变量名不同不会造成困扰。因为我们可以很容易的通过变量名来区分两个变量(我们班有个叫旺财的,别人班有个叫富贵的,我叫旺财你肯定知道我要找的是谁吧!)。但是在两个变量名相同时要怎么办呢(我们班有个旺财,隔壁班也有个旺财,我在走廊里喊一声旺财,你觉得我在叫谁···)?
这种情况逻辑学上叫二义性(ambiguity)。即有两种可能的解释,却没有任何区分的方法。怎么办呢?人为规定嘛。C语言规定:在变量作用域重叠时,作用域为小范围的变量覆盖大范围的变量。譬如函数内有个局部变量var,文件内有个全局变量var。则在该函数内部(准确的说是函数内部var局部变量定义体之后的部分),你使用var访问的是var局部变量,此处全局变量var被掩蔽(要想在此处访问全局变量var,对于C++可以使用::符号,而C语言中则没有域操作符::)。
代码如下:
#include
int var = 7; // 全局变量var
void func1(void)
{
printf("In func1, var = %d.\n", var);
}
void func2(void)
{
int var = 5;
printf("In func1, var = %d.\n", var);
}
void func3(void)
{
int var = 5;
#ifdef __cplusplus
printf("__cplusplus defined.\n");
printf("In func1, var = %d.\n", ::var);
#endif
}
int main(void)
{
func1();
func2();
func3();
return 0;
}
/*
* gcc编译,执行结果:
* In func1, var = 7.
* In func1, var = 5.
*
* 结论:在line13中,func2中局部变量var屏蔽了全局变量var。
*
* g++编译,执行结果:
* In func1, var = 7.
* In func1, var = 5.
* __cplusplus defined.
* In func1, var = 7.
*/