网站首页 > 技术文章 正文
在程序中,如果要表示某个人的年龄,则可以使用int型变量来表示,如:int age = 0;在这个过程中,为了表示年龄我们定义了一个int型变量,可以而变量的定义是可以在函数的内部定义,也可以在块内部定义,还可以在函数的外部定义。由于变量定义的位置不同,因而具有不同的使用范围,超出这个使用范围该变量就不能被访问,即我们所说的作用域。
根据作用域的不同,将变量分为局部变量和全局变量。
局部变量与全局变量
1、普通局部变量
- 在一个函数内部定义,只在函数范围内有效;
- 在复合语句中定义,只在复合语句中有效;
- 随着函数调用的结束或复合语句的结束而消亡
这里定义的变量a位置在main函数内部,因此只能在main函数中使用,在main函数外部的其他函数中无法使用。
(1)这里定义了两次变量a,它们不会冲突?
- 不会冲突,因为他们的作用域不同,不同作用域的变量名称是可以重复的。变量a的第一次定义:int a = 100;是在main函数内部,其在main函数未结束或者未返回之前都是有效的;变量a的第二次定义,int a = 10;是在块(即大括号)中定义的,它只在大括号中有效,离开这个大括号变量a就会消亡。
(2)既然定义了两个变量a,如何区分两次使用printf打印的到底是哪个变量?
- 因为变量a=10;的作用域只在大括号内部,出了大括号它就完蛋了,所以第二次使用printf打印的当然是变量a=100;
- 很显然,变量a=100和变量a=10在大括号内都是有效的,那第一次打印的是哪个呢?这里遵循“就近原则”,即打印的是变量a=10。
2、普通全局变量
- 在函数外定义,可被本文件中其它函数所共用;
- 作用域:从定义变量的位置开始到文本结束;
- 生存周期:在程序运行的整个周期都存在;
- 若其它文件中的函数调用此变量,须用extern进行声明
说明:g为全局变量,其作用域为当前文件,因此在main函数中我们可以去使用它。
注:同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用,就是说局部变量的值会覆盖全局变量的值,也就是上面提到的“就近原则”,看个例子:
静态局部变量与静态全局变量
静态变量在定义的时候与普通变量不同,静态变量定义时用static来修饰,如:static int num = 10;
1、静态局部变量
- 第一次进入函数调用变量时初始化,以后每次进入函数,此变量保持上一次的值,具有记忆特性;
- 作用域:本函数范围内;
- 生存周期:整个程序运行的周期。
从上面例子可以看出,普通局部变量与静态局部变量不同,静态局部变量具有“记忆性”。
2、静态全局变量
- 在函数外定义,作用范围被限制在所定义的文件内,在其他文件中即便是用extern来声明也不能被使用;
- 不同文件静态全局变量可以重名,但作用域不冲突;
- 生存周期:整个程序运行的周期。
注意事项:
- 虽然普通全局变量和静态全局变量的生命周期相同,但还是有区别的,比如,在多个.c源文件中,全局静态变量是定义该变量的源文件所独享的,即便是加extern修饰,其他源文件也是不能访问的,但普通全局变量却可以;
- 形参变量属于被调函数的局部变量,实参变量属于主调函数的局部变量;
- 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰;
- 局部变量如不作说明,都是auto的,且auto可以省略;
- 局部变量也可以定义为register型,告诉系统对其分配地址时尽量将其分配在寄存器中,以提高访问速度;
- 尽量少使用全局变量,因为在程序执行整个过程中都占用资源,同时会破坏函数的封闭性;
- 同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用;
- 静态局部变量如不赋初值,编译时系统会自动将其赋值(整形变量为0,指针为NULL);动态局部变量如不赋值,则为随机值。
接下来就该写写C中的宏定义及预编译命令了,想了解的小伙们可以关注。
猜你喜欢
- 2024-09-26 C语言存储类之内部链接的静态变量
- 2024-09-26 零基础学C语言——作用域(c语言:作用)
- 2024-09-26 C/C++关键字static作用解析(c++中static关键字)
- 2024-09-26 这个offer你吃定了!C++「面试真题」及基本知识点总结
- 2024-09-26 extern关键字详解(explain关键字)
- 2024-09-26 【python 基础篇 十四】python函数的作用域
- 2024-09-26 PHP入门读书笔记(三): 常量和变量
- 2024-09-26 静态变量使用场景?(静态变量使用场景)
- 2024-09-26 C语言static关键字的全面深入探讨
- 2024-09-26 Excel-VBA教程005,什么是变量,变量的类型、变量的作用域?
- 1515℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 575℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 514℃MySQL service启动脚本浅析(r12笔记第59天)
- 487℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 486℃启用MySQL查询缓存(mysql8.0查询缓存)
- 470℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 450℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 448℃MySQL server PID file could not be found!失败
- 最近发表
-
- 宝塔面板Nginx如何提高网站访问速度?
- 接口调试工具ApiPost中form-data/x-www-form-urlencoded/raw区别
- 高并发场景下,Nginx性能如何提升10倍?
- 高并发场景下,Nginx如何抗住千万级流量?
- 浏览器中在线预览pdf文件,pdf.mjs插件实现web预览pdf
- 为什么你的网站加载慢?90%的人忽略了这2个设置。
- 别再无脑复制Nginx配置了!掌握这10个"性能核弹"级参数
- 你的Nginx配置,可能就是你网站最慢的一环,注意这几个优化参数
- 深入浅出HTTP压缩技术(http2压缩)
- C程序设计之:1-1/2+1/3-... + 1/n 的和
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (83)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)