C语言变量和全局变量能否重名问题
作者:Code repairman
C语言变量和全局变量能否重名
解答
全局变量和局部变量是按照变量的作用域划分的。
简单地说,局部变量是定义在函数内部的变量;全局变量是定义在函数之外的变量。
全局变量可以为本文件中其他函数所共用。
局部变量和全局变量可以重名,局部变量会屏蔽全局变量。要使⽤全局变量,要在变量名前添加" :: "。
心得
局部变量和全局变量是可以重名的,因为它们的作用域不同。
在函数中,默认使用的是局部变量。
全局变量和局部变量重名了会怎么样
在交流群里面看到这样一个问题:
为什么这个程序中下面我定义的void型函数smart在全局变量前声明了,但是在man函数中调用了smart函数,m的值打印出来还是0。
#include<stdio.h> int m; void smart(void); int main(void) { printf("m = %d.\n", m); smart(); printf("m = %d.\n", m); //m+=1; //printf("m = %d.\n", m); return 0; } void smart(void) { int m = 25; }
说实话,这个问题对于C语言有一个简单理解的肯定明白问题在哪里。但是,群里面人讲了半天没讲到重点,还是有点抓急。有讲局部变量函数执行结束自动释放的,所以全局变量的m没有被改变。有讲作用域不同的。千奇百怪的回答。
因为,能够搜到这篇文章的,大概率都是新手小白,我也就不会讲太深奥的东西了,尽量以简单易懂的语言讲明白。
全局变量和局部变量同名编译器是如何处理
(1)如果在函数内部同时存在一个局部变量和一个全局变量,它们的名字相同,那么在函数内部使用该变量时,将优先使用局部变量。
(2)举个现实生活的例子,两个除了长相不同,其他都一样的角色。一个是游戏活动期间才能玩的角色A,一个是你永久拥有的角色B。
- 虽然他们的数值是一样的,但是对于绝大多数玩家而言,在活动期间大概率还是会优先用限时角色A。
- 但是呢,游玩角色,打怪能够升级。可是角色A在活动结束之后,就会消失,那么活动期间你所得到的所有经验值都会消失。并不会反馈给永久角色B。
- 最后,你只能愤愤不平,被官方摆了一套。
(3)根据上面这个举例,我们就很好理解了全局变量和局部变量同名情况了。
对于计算机而言,全局变量和局部变量究竟是什么?
(1)我们都知道,对于计算机而言,他本质上只能够识别0和1。哪些所谓的代码,变量名,其实都是给人类看的。因此,我们人类看到全局变量和局部变量名字一样,但是对于计算机而言是不一样的。
(2)这个将人类看的懂的语言,变成计算机能够看懂的01语言需要通过编译器来决定。
(3)当你在代码中写了一个全局变量m和一个局部变量m。编译器就会开辟两个不同的地址分别存放全局变量m和局部变量m。
- 当你在smart()函数调用m变量的时候,编译器就会告诉机器,你应该操作的是地址A。
- 当smart()函数调用结束的时候,编译器就会告诉机器,你应该操作的是地址B。同时机器会自己将地址A释放掉。
- 那么你在地址A做的操作是无效的。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。