变量的作用域

凡是在{}以内的变量为局部变量,也包括形式参数。

凡是{}外的变量为全局变量

作用域:

{}以内的作用域为局部作用域,主要包含的事变量

{}以外的作用域为全局作用域,包含的是变量和函数

同一作用域内,不可以用重命名的变量
局部变量的作用域,起始于定义处,直到所在的大括号处结束。
全局变量的作用域,起始与定义处,知道本文件结束。

作用域叠加:

全局变量同局部变量的作用域叠加,在不同的作用域中,可以有重名的标识符,局部变量会覆盖全局变量的作用域。

#include<stdio.h>
int a = 100;
int main() {int a = 10;printf("a = %d\n",a);//10return 0;
}

更小的作用域{}只能再次划分局部作用域

#include<stdio.h>
int a = 100;
int main() {int a = 10;{//只能用于局部int a = 1;printf("a = %d\n",a);//1}return 0;
}

全局变量命名污染

函数是全据变量,要防止命名污染,全局变量的使用更要避免命名重名。尽量少用全局变量。

局部变量的生命周期

函数的生命周期起始与调用,结束与调用结束。函数体内的局部变量相同。
main函数比较特殊它开始于程序的开始,结束语程序的结束

全局变量的生命周期

全局变量的生命周期起始与main函数的调用,结束于main函数的结束,等价于程序的生命周期。
main函数中的变量生命周期与全局变量相同,但他们的作用域不同

修饰符

auto类型

只能用于修饰局部变量,表示该变量存储在栈上stack
特点:随用随开,用完消失
默认的局部变量,就是auto类型,所以通常将其省略。C++中auto是自动变量。
eg:

auto int a = 23;

register

只能修饰局部变量,将内存中的变量升级到cpu寄存器中存储,这样访问速度会很快。存储cpu的变量,速度快但数量有限,通常用来优化。用于频繁使用的变量。一般不用。

extern(通关文牒)

修饰全局变量,
c语言是订单文件编译,然后再将编译的.o文件同库仪器连接成可执行文件,所以跨文件需要声明。
区分声明预定义:extern可以省略,不建议省略
eg:

int a;//声明
int a = 120;//定义

全局变量声明未定义时是0,局部变量是随机数。vs中是不行的。局部变量必须定义。

static(隔离出境)

static修饰局部变量,默认初始化0

#include<stdio.h>
void func();
int main() {for(int i = 0;i < 10;i++) {func();}return 0;
}
void func() {int a = 1;//默认auto修饰,存储在栈中即用即消失,所以每次用完消失++操作无效。printf("a = %d\t",a++);static int b = 1;//修饰的局部变量存放在data块中,生命周期等同与进程。 //无论以后调用多少次函数,它的初始化一次printf("b = %d\n",b++);printf("++++++++++++++++++");
}
/*
a = 1   b = 1
++++++++++++++++++
a = 1   b = 2
++++++++++++++++++
a = 1   b = 3
++++++++++++++++++
a = 1   b = 4
++++++++++++++++++
a = 1   b = 5
++++++++++++++++++
a = 1   b = 6
++++++++++++++++++
a = 1   b = 7
++++++++++++++++++
a = 1   b = 8
++++++++++++++++++
a = 1   b = 9
++++++++++++++++++
a = 1   b = 10
++++++++++++++++++
*/

static修饰的变量存储在data区域中,生命周期等同于进程,和函数的作用域无关

#include<stdio.h>
void print(int num,int age,char sex,float score);
int main() {print(1001,32,'x',99);print(1001,32,'x',99);print(1001,32,'x',99);print(1001,32,'x',99);print(1001,32,'x',99);print(1001,32,'x',99);print(1001,32,'x',99);print(1001,32,'x',99);print(1001,32,'x',99);print(1001,32,'x',99);
}
void print(int num,int age,char sex,float score) {static int flag = 1;if(flag == 1) {printf("num\tage\tsex\tscore\tcount\n");flag = 0;}static int count = 0;printf("%d\t%d\t%c\t%.2f\t%d\n",num,age,sex,score,++count);
}
//控制执行次数,记录打印某函数的调用次数多用于避免多次加载的资源

全局变量会带来命名污染,好处(全局可用,避免传参),用static解决。一个全局变量拥有外延性,可以被其他的文件所用,extern。static修饰全局变量以后,外延性消失,变成本文件内部的全局变量
main.c

static int a = 100;

bb.c

static int a = 200;

这样两者文件中的a都限制在本文件中
main.c

extern a;
printf("a = %d\n",a);//报错,编译不通过

bb.c

static int a = 200;//限制了外延性,成了局部变量

同样适用于函数
全局变量被static修饰后,存放的位置没有变,改变的了作用域,外延性被限制。

转载于:https://www.cnblogs.com/intelwisd/p/8290534.html

C/C++(变量作用域)相关推荐

  1. TENSORFLOW变量作用域(VARIABLE SCOPE)

    举例说明 TensorFlow中的变量一般就是模型的参数.当模型复杂的时候共享变量会无比复杂. 官网给了一个case,当创建两层卷积的过滤器时,每输入一次图片就会创建一次过滤器对应的变量,但是我们希望 ...

  2. [JS] undefined、null、ReferenceError的区别、变量作用域问题

    undefined.null.ReferenceError的区别 null表示"没有对象",即该处不应该有值. 典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. ( ...

  3. C++ 笔记(06)— 变量作用域(局部变量、全局变量、静态局部变量)

    作用域是程序的一个区域,一般来说有三个地方可以定义变量: 在函数或一个代码块内部声明的变量,称为局部变量: 在函数参数的定义中声明的变量,称为形式参数: 在所有函数外部声明的变量,称为全局变量: 1. ...

  4. Go 学习笔记(6)— 变量定义、变量声明、变量作用域

    1. 变量定义 Go 语言变量名由字母.数字.下划线组成,其中首个字符不能为数字.声明变量的一般形式是使用 var 关键字: var varName dataType [= value] Go 语言和 ...

  5. 深入理解PHP原理之变量作用域

    作者:laruence(http://www.laruence.com/) 地址: http://www.laruence.com/2008/08/26/463.html                ...

  6. append函数_连载|想用Python做自动化测试?函数的参数传递机制及变量作用域

    " 这一节有点难.看不懂没关系.继续往后学,回头再来看." 10.6 函数参数传递的机制 10.6.1 值传递与引用传递 编程语言的参数传递机制通常有两种: 值传递 拷贝参数的值, ...

  7. Python变量作用域的规则以及如何搜索内置作用域

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!有不懂的问题可以私聊我哦! **作用域:**是指变量的生效范围,例如本地变量.全局变量描述的就是不同的生效范围 ...

  8. C++中的变量作用域介绍

    1.Cpp的变量作用域 作用域是程序的一个区域,一般来说有三个地方可以定义变量: 局部变量:在函数或一个代码块内部声明的变量 形式参数:在函数参数的定义中声明的变量(稍后介绍) 全局变量:在所有函数外 ...

  9. Python变量作用域问题

    本文最后更新于2018-6-20,可能会因为没有更新而失效.如已失效或需要修正,请联系我! 今天在用Python写程序时突然想起了Python变量作用域的问题,代码如下: def run():glob ...

  10. mysql变量作用域,变量作用域 | 类型、变量和值 | JavaScript 权威指南

    变量作用域 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #2 724 views 0 likes 0 collects 变量的作用域指的是程序源码中定义这个变量的区域,全局变量具有全局作用 ...

最新文章

  1. 如何对待新事物_如何利用这个专栏才能更高效地进步?
  2. php注册树模式,php基础设计模式大全(注册树模式、工厂模式、单列模式)
  3. React开发(252):react项目理解 ant design spining加载中
  4. Python数据预处理之异常值的处理——【自定义的three_sigma()函数、boxplot()方法】
  5. java dumpheap_java程序性能分析之thread dump和heap dump
  6. Android RecyclerView(八)设置自定义 下拉刷新 与 上拉加载数据
  7. 《Cracking the Coding Interview》——第10章:可扩展性和存储空间限制——题目1
  8. 有人回嘴顶撞过驾校教练吗?后果怎样?
  9. 《Python核心编程》第二版第308页第十一章练习 续一 -Python核心编程答案-自己做的-...
  10. linux系统移植和根文件系统制作
  11. easyui三级联动 html,jQuery使用EasyUi实现三级联动下拉框效果实例分享
  12. vue前端项目打包并且在服务器上部署过程
  13. 数学建模论文分析--2015A高教社杯--太阳影子定位的多目标优化模型
  14. Laravel 之 Redis 命令大全
  15. 大众点评字体_大众点评字体解析
  16. 为什么用易互动投屏电视没声音?
  17. java泛型(1) 认识泛型
  18. oracle报错imp报错00008,Oracle imp导入数据时报IMP-00032与IMP-00008的解决方法
  19. Uniswap v3 详解(五):Oracle 预言机
  20. HI3516DV300 图像输入

热门文章

  1. 我要做 Android 之面笔试
  2. 安装部署elasticsearch过程详解
  3. SpringFramework核心技术一(IOC:详细的依赖和配置)
  4. rox + openbox + fbpanel + conky打造又快又稳的桌面[转]
  5. transform与rigibody以及角色控制器的运动
  6. 高并发消息队列常用通知机制
  7. c++ static 关键字总结
  8. redis copy-on-write机制
  9. 修改docker内mysql配置后无法启动解决方法
  10. 4.额外线程能力(Additional Thread Capabilities)