C/C++变量作用域
今天忽然想起作用域的问题,随手试验了下。
代码:
#include <stdio.h>
#include <stdlib.h>
// mark1
int n=1;
// scope 1 >>>
int main()
{
printf("i:%d\n", n);
// mark2
int n=2;
// scope 2 >>>
printf("ii:%d\n", n);
{
// mark3
int n=3;
// scope 3 >>>
printf("iii:%d\n", n);
{
// mark4
int n = 4;
// scope 4 >>>
printf("iiii:%d\n", n);
// scope 4 <<<
}
printf("iiiii:%d\n", n);
// scope 3 <<<
}
printf("iiiiii:%d\n", n);
return 0;
// scope 2 <<<
}
// scope 1 <<<
输出:
g++ -o main main.c
[mytmp@localhost r]$ ./main
i:1
ii:2
iii:3
iiii:4
iiiii:3
iiiiii:2
说明:
mark1处定义的变量n是全局的,即可以在任何本文件(或者说模块,如果将一个.c文件认为是一个模块的话)中的函数中都是可达的,可见的,拥有操作(读或者写)的,其作用域是scope1。
mark2处定义的变量n是局部变量,其作用域是scope 2。
mark3处定义的变量n是局部变量,其作用域是scope 3。
mark4处定义的变量n是局部变量,其作用域是scope 4。
变量的作用域,高级别的,大的作用域,总是会被小的作用域覆盖,如果有重名变量的情况下。
mark1处的n作用域最大,但是其在main函数中的mark2处的“int n=2;”之后已经被覆盖作用域了,所以在scope2中,所有对n的操作都不再是全局mark1处的n这个变量了,而是较小作用域的mark2处定义的那个n。
但是,作用域会恢复。当脱离了小的作用域后,大的作用域依然存在。可见“iii”、“iiii”以及“iiiii”输出。在iiii时,存取的是小作用域,覆盖了大作用域iii处的n,但是当本作用域结束时,大作用域依然在,此时操作,就是大作用域的那个变量了。
可以用一对花括号来代表一个语句块,即一个作用域的范围。
在同一个作用域中两次定义同一个变量会导致重定义:“redefinition of xxx”。
while、for等{}中也是单独的作用域。
以后有别的思考再来补充吧~