• C语言——全局变量和局部变量重名了会怎么样


    前言

    (1)今天在交流群里面看到这样一个问题:
    为什么这个程序中下面我定义的void型函数smart在全局变量前声明了,但是在man函数中调用了smart函数,m的值打印出来还是0。

    #include
    
    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;
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    (2)说实话,这个问题对于C语言有一个简单理解的肯定明白问题在哪里。但是,群里面人讲了半天没讲到重点,还是有点抓急。有讲局部变量函数执行结束自动释放的,所以全局变量的m没有被改变。有讲作用域不同的。千奇百怪的回答。
    (3)因为,能够搜到这篇博客的,大概率都是新手小白,我也就不会讲太深奥的东西了,尽量以简单易懂的语言讲明白。

    全局变量和局部变量同名编译器是如何处理

    (1)如果在函数内部同时存在一个局部变量和一个全局变量,它们的名字相同,那么在函数内部使用该变量时,将优先使用局部变量。
    (2)举个现实生活的例子,两个除了长相不同,其他都一样的角色。一个是游戏活动期间才能玩的角色A,一个是你永久拥有的角色B。
    <1>虽然他们的数值是一样的,但是对于绝大多数玩家而言,在活动期间大概率还是会优先用限时角色A。
    <2>但是呢,游玩角色,打怪能够升级。可是角色A在活动结束之后,就会消失,那么活动期间你所得到的所有经验值都会消失。并不会反馈给永久角色B。
    <3>最后,你只能愤愤不平,被官方摆了一套。
    (3)根据上面这个举例,我们就很好理解了全局变量和局部变量同名情况了。

    对于计算机而言,全局变量和局部变量究竟是什么?

    (1)我们都知道,对于计算机而言,他本质上只能够识别0和1。哪些所谓的代码,变量名,其实都是给人类看的。因此,我们人类看到全局变量和局部变量名字一样,但是对于计算机而言是不一样的。
    (2)这个将人类看的懂的语言,变成计算机能够看懂的01语言需要通过编译器来决定。
    (3)当你在代码中写了一个全局变量m和一个局部变量m。编译器就会开辟两个不同的地址分别存放全局变量m和局部变量m。
    <1>当你在smart()函数调用m变量的时候,编译器就会告诉机器,你应该操作的是地址A。
    <2>当smart()函数调用结束的时候,编译器就会告诉机器,你应该操作的是地址B。同时机器会自己将地址A释放掉。
    <3>那么你在地址A做的操作是无效的。

  • 相关阅读:
    【Java】泛型讲解
    生成式AI的新战场:逻辑推断与推理计算
    寻找两个正序数组的中位数
    虹科 | 解决方案 | 汽车示波器 远程诊断方案
    正则表达式:Regular Expression
    通过插件去除Kotlin混淆去除 @Metadata标记
    Redis使用基础教程
    I/O设备的I/O控制器
    腾讯云服务器与普通服务器区别在哪?如何选择?
    精准配置无线接入点发射功率
  • 原文地址:https://blog.csdn.net/qq_63922192/article/details/132582419