在C语言中,允许局部变量和全局变量重名。尽管在这一做法被部分人诟病,在java中也禁止这一用法,但既然C语言中允许这么做,那我们就来分析下不同情况下调用同名的变量得到的结果。
这里先引用牛客网上的一道题目
1 | static int a = 1; |
问上述程序的输出结果是什么:
A、1 2 3 4
B、1 2 2 2
C、1 2 2 4
D、1 1 1 4
正确答案为B。对于第一次输出和第二次输出结果是显而易见的。在第三次输出中,即fun2函数中,定义了一个与全局变量同名的局部变量,它没有任何返回值或者被该次执行程序以外任何程序读取a值,所以第三次输出仍然是2。fun3函数中,定义了一个静态的局部变量,静态局部变量在函数调用结束后仍然存在,它的内存空间不会被释放,但其他函数是不能引用它的。所以,两个静态变量虽然同名,但并不是一样的东西。所以第四次输出结果仍然是2。
【划重点】
在所有函数体外部定义的变量称为全局变量。全局变量的作用域为定义开始到文件结束。
在函数体内部定义的变量称为局部变量,作用域仅限于函数体内部。形参变量、在函数体内定义的变量都是局部变量。main函数中定义的变量也是局部变量,只能在main函数中使用。同时,main函数中不能使用其他函数中定义的变量。
当在调用变量时,若有多个同名变量起作用的时候,则使用作用域离自己最近的变量。
最后再举一个例子:
1 |
|