static类型的变量
c语言中变量的储存类型有以下四种
auto 如果没有定义储存类型 默认就是这个类型 比如 int a = 10; 储存类型就是 auto;编译器会跟你定义的位置,以及用途,自动帮你决定使用那种储存类别;
如果你定义在函数内 ,那么编译器就把他当做局部变量,如果定义在函数外部,编译器把他归为全局变量,如果这个变量用作 循环因子(for循环中 i );编译器就把他
定义为寄存器变量;
register 寄存器变量,用作循环因子等使用频率极高的变量
extren 全局变量 *从定义的位置开始* 在整个程序执行期间有效,如果这个程序是多文件的,那么在其他文件中也可以使用这个变量;
无论是局部变量还是全局变量,一般都不显示的指明,有编译器来自动区分就好了;
【局部变量 和全局变量的区别】:
全局变量:(生命周期)在程序执行期间有效,(作用域)从定义起本文件和其他文件都可以引用
局部变量:(生命周期)函数执行完就从内存中销毁,(作用域)在函数内有效
static 静态变量 ,可以修饰局部变量和全局变量 ; 上面通过作用域和生命周期对比了局部变量和全局变量,那么加上static关键字修饰后有什么变化呢?
[static 全局变量]:(生命周期)在程序执行期间有效,(作用域)作用域缩小了,只有本文件可以引用,其他文件不能引用了
[static 局部变量]:(生命周期)生命周期变了,在整个程序期间有效,(作用域)还是在函数内有效
看个例子:
#include <stdio.h>
void test() {
static int t = ;
printf("%d\n",t++);
}
int main(void) {
test(); //
test(); //
test(); //
}
如果 去掉static修饰 那么test函数每次打印的都是 3;
值得注意的是,虽然加了static修饰后,t的生命周期变长了(不会因为test执行完就销毁),但是t的作用域还是没有变的,尝试在 main函数里面打印t的值报错;
这个例子其实可以用全局变量t来实现,效果是一样的,那么为什么还需要static关键字呢?
有两个 因素:
(1) 全局变量存放在内存中,而局部变量存放在寄存器中,运行速度相差很大; (这一点不是主要的因素)
(1) 全局变量如果没有加 static的话,在多文件程序里面 多个文件可以读取到这个变量,容易造成变量重名,但是有些时候 有的变量需要在整个文件中都有效又必须要全局变量才能行,
那么加上static关键字就可以两者兼得了,既定义了全局变量,在多文件程序中又不用担心变量重复,适合封装单独的功能模块;
static类型的变量的更多相关文章
- 【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- static 类成员变量 和 static const类成员变量
1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...
- C# 类型和变量
C# 中的类型有两种:值类型 (value type) 和引用类型 (reference type).值类型的变量直接包含它们的数据,而引用类型的变量存储对它们的数据的引用,后者称为对象.对于引用类型 ...
- java:构造方法:无参构造/有参构造 this static关键字 静态变量 静态方法 代码块 封装 静态常量。
/*构造方法是一种特殊的方法,专门用于构造/实例化对象,形式:[修饰符] 类名(){ }构造方法根据是否有参数分为无参构造和有参构造*/public class Dog { ...
- 用static声明外部变量与内、外部函数
1.用static声明外部变量 若希望某些外部变量只限于被本文件引用,而不能被其他文件引用,可以在定义外部变量时加一个static声明. 例:(file1.c) #include <stdafx ...
- C#指南,重温基础,展望远方!(3)类型和变量
C# 有两种类型:值类型和引用类型. 值类型的变量直接包含数据,而引用类型的变量则存储对数据(称为“对象”)的引用.对于引用类型,两个变量可以引用同一对象:因此,对一个变量执行的运算可能会影响另一个变 ...
- C#3.0新增功能03 隐式类型本地变量
连载目录 [已更新最新开发文章,点击查看详细] 从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式“类型”var. 隐式类型本地变量为强类型,就像用户已经自行声明该类型,但 ...
- C#详解类型,变量与对象
本节内容: 1.什么是类型(Type) 2.类型在C#语言中的作用 3.C#语言的类型系统 4.变量.对象与内存 1.什么是类型(type) 类型又名数据类型(Date Type),是数据在内存中存储 ...
随机推荐
- Spring Security(十九):6. Security Namespace Configuration
6.1 Introduction Namespace configuration has been available since version 2.0 of the Spring Framewor ...
- 初学Python——Socket网络编程
认识socket socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递.我们知道网络 通信 都 是基于 ip+port(端口) 方能定位到目标的具体机 ...
- a,b,c为3个整型变量,在不引入第四个变量的前提下写一个算法实现 a=b b=c c=a?(异或解决值互换问题)
package com.Summer_0424.cn; /** * @author Summer * a,b,c为3个整型变量,在不引入第四个变量的前提下写一个算法实现 a=b b=c c=a? */ ...
- C语言中指针变量的加减运算
1.指针变量中存放的是地址值,也就是一个数字地址,例如某指针变量中的值是0x20000000,表示表示此指针变量存放的是内存中位于0x20000000地方的内存地址.指针变量可以加减,但是只能与整型数 ...
- Codechef CNTL Counting is life 生成函数
传送门--Vjudge 第一问很氵,如果\(K,N\)同奇偶就是\(2^K-1\),否则就是\(2^K-2\) 第二问似乎是可重排列,考虑指数型生成函数. 如何限制某些数必须要出现奇数/偶数次?考虑\ ...
- redis底层设计(四)——功能的实现
redis中我们会经常用到事务.订阅与发布.Lua脚本以及慢查询日志,接下来我们就一一对他们进行探讨学习. 4.1事务 redis通过MULTI.DISCARD.EXEC和WATCH四个命令来实现事务 ...
- Python 学习 第十六篇:networkx
networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法.图是由顶点.边和可选的属性构成的数据结构,顶点表示数据,边是由两个顶点唯一确定的,表示两个顶点之间的关系.顶点和边 ...
- 比官方文档更易懂的Vue.js教程!包你学会!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由蔡述雄发表于云+社区专栏 蔡述雄,现腾讯用户体验设计部QQ空间高级UI工程师.智图图片优化系统首席工程师,曾参与<众妙之门> ...
- .NET-记一次架构优化实战与方案-底层服务优化
目录 .NET-记一次架构优化实战与方案-梳理篇 .NET-记一次架构优化实战与方案-前端优化 .NET-记一次架构优化实战与方案-底层服务优化 前言 经过上一篇<.NET-记一次架构优化实战与 ...
- 体验usually.js的管道函数——pipe函数
体验usually.js的管道函数——pipe函数 usually.js 是一个面向现代 Web 开发的 JavaScript 函数库,基于 ES6 开发.最新版本2.4.1,最新版本usually. ...