首页 > 其他分享 >C语言——全局变量和局部变量重名了会怎么样

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

时间:2023-09-03 21:38:31浏览次数:35  
标签:角色 void 局部变量 C语言 编译器 全局变量 smart


前言

(1)今天在交流群里面看到这样一个问题:
为什么这个程序中下面我定义的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;
	
}

(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做的操作是无效的。


标签:角色,void,局部变量,C语言,编译器,全局变量,smart
From: https://blog.51cto.com/zyxfighting/7343315

相关文章

  • 材料中的光速+defparam用法+C语言的宏使用
    材料中的光速https://blog.csdn.net/weixin_43229030/article/details/106745060空气中,相对介电常数和相对导磁率都为1,光的速度为12in/ns绝大多数互连线中的光速约为12in/ns/sqrt(4)=6in/ns。当估算电路板上互连线中信号的连度对,就可以假定它约为6in/ns。defparam的用法......
  • 东方博宜OJ1010 数组元素的排序 C语言版
    题目描述对数组的元素按从小到大进行排序。输入第一行有一个整数 n ( 5≤n≤10 );第二行有 n 个整数,每个整数的值在 [0,109]的范围内。输出输出排序后的数组。样例输入812368745输出12345678来源数组问题代码 #incl......
  • C语言-指针
    目录指针行指针多级指针void指针const修饰符指针前置概述:在计算机内存中最小的操作单元是字节Byte(不是位bit)。每一个字节单元,都有一个编号,称为地址。指针定义:专门用来存放地址的变量,称为指针变量,通称指针。格式:<存储类型><数据类型>*<指针变量名>inta=10;int*p......
  • C语言-函数
    函数基本用法举例:两数求和#include<stdio.h>intsum(int,int);//函数的声明,函数的原型intmain(intargc,charconst*argv[]){ intm=10; intn=20; ints; s=sum(m,n); printf("%d\n",s);}intsum(inta,intb){ intsum; sum=a+b; returns......
  • C语言自增++放前面还是后面?
    《STL标准程序》里边一直提到前置比后置效率更高。关于此的一点个人理解记录下来。a++:加的过程中要先产生一个临时变量temp,加1之后的值赋给temp,然后你可以使用a(在if、for、while..中),最后再把temp的值assign给a。++a:这个就是直接在a上加1了,然后改怎么用,就怎么用。归根结底:二者的......
  • 计算机萌新的成长历程——初识C语言16
    大家好,很高兴又能跟各位朋友见面了,前面我们花了两篇内容来探讨操作符的相关内容,今天咱们要开始探讨新的内容了——常见关键字。对于常见关键字,我是这样理解的——C语言中自带的可以直接使用的字符,比如咱们的数据类型:int、char、short、long、longlong、float、double……又比如咱......
  • 汉诺塔问题C语言递归
    (汉诺塔问题C语言递归)什么是汉诺塔问题汉诺塔问题是一个经典的问题。汉诺塔(HanoiTower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另......
  • 通过c语言来实现斐波那契数列
    斐波那契数列是一组第一位和第二位为1,从第三位开始,后一位是前两位和的一组递增数列,像这样的:0、1、1、2、3、5、8、13、21、34、55......这个数列从第3项开始,每一项都等于前两项之和。以下通过c语言来实现这个程序#include<stdio.h>//1123581321345589intmain(){ /......
  • 简单理解c语言指针
    &p(取地址)P*p(间接寻址) 假设p指向整数型变量a,那么可以理解为p等同于a的地址。*是间接寻址运算符,对p进行操作,找到p这个地址中所对应(放的)东西。也就是说,*p就是a。做个比喻,将*理解成取平方,而操作数p是地址,那么p的平方就是a,如2的平方就是4。(不过这里其实p不像是常量而更像变量x,......
  • C语言数组(9)--- 数组名(2)
    一.导入我们上篇文章讲了一维数组的数组名,接下来我们将介绍二维数组的数组名,我们先来猜一下以下代码执行的结果是多少:#include<stdio.h>intmain(void){ intarr[3][4]; intsz=sizeof(arr); printf("%d",sz); return0;}A.3B.4C.12D.48答案:D,解析:我们之前说过二维数组......