乐山网站营销推广哪家公司好,外贸免费网站制作,局网站建设进入前十名,wordpress 装饰模板C语言深度剖析
关键字auto-最宽容大度的关键字
变量的分类
代码块#xff1a;用{ }括起来的区域
局部变量#xff1a;包含在代码块中的变量#xff0c;局部变量具有临时性#xff0c;进入代码块#xff0c;自动形成局部变量#xff0c;退出代码块自动释放。
全局变量…C语言深度剖析
关键字auto-最宽容大度的关键字
变量的分类
代码块用{ }括起来的区域
局部变量包含在代码块中的变量局部变量具有临时性进入代码块自动形成局部变量退出代码块自动释放。
全局变量在所有函数外定义的变量。全局变量具有全局性。
作用域概念指的是该变量可以被正常访问的代码区域
#include stdio.h
int main()
{int x10;if(x10){y20;printf(%d %d,x,y);//x,y均可打印}printf(%d %d,x,y);//y会报错return 0;
}局部变量只在本代码块内有效
全局变量整个程序运行期间都有效
生命周期
概念变量从定义到被释放的时间范围所谓的释放是指曾经开辟的空间“被释放”
局部变量进入代码块形成局部变量开辟空间退出代码块“释放”全局变量
全局变量定义完成之后程序运行的整个生命周期内该变量一直有效
作用域VS生命周期
打个比方来说有一位大富豪从他出生到死亡所做的贡献从时间的维度上来理解我们可以说是生命周期他所影响的范围可以叫做作用域作用域更偏向于空间的维度来说
再来举个例子
#include stdio.h
int g_val20;
int main()
{int g_val100;printf(%d,g_val);return 0;
}当局部变量和全局变量命名起冲突的时候编译器会优先考虑局部变量所以打印结果为100
可以理解为就近原则
总结
作用域该变量的有效范围
生命周期时间的概念什么时候被开辟什么时候被释放
auto相关
如何使用一般代码块中定义的变量即局部变量都是auto关键词修饰的不过一般都是省略的
默认所有的变量都是auto修饰的吗
不是一般用来修饰局部变量
局部变量临时变量自动变量统称为局部变量
auto关键字已经很老永不使用在C语言中但是C和这个不一样
关键字 register-最快的关键字
铺垫知识 寄存器的本质
在硬件层面上提高计算机的运算效率。因为不需要从内存中读取数据啦。
register修饰变量
尽量将所修饰的变量放到CPU寄存区中从而达到提高效率的目的
那么什么样的变量可以用register
1.局部的(全局会导致CPU寄存器长时间被占用)
2.不会被写入的写入就需要写回内存后续还需要读取检测那么register的意义何在
3.是高频被读取的提高效率
4.如果要使用不是大量使用寄存器数量有限
#include stdio.h
int main()
{register int a10;printf(%d\n,a);return 0;
}结果可以被正常打印但是既然是存放在寄存器中也就不是存储在内存中所以不可以使用取地址符号
关键字static-最名不副实的关键字
对extern声明的小小补充
当我要对一个函数进行声明的时候可不可以像如下情况
extern int v_gal100;对这个变量进行了赋值这是不可以的因为声明并没有开辟空间100这是开辟空间或者初始化
所以我们得出结论
所有的变量声明的时候不能设置初始值
再来将讲一点
我们这里是main.c这个源文件去调用test.c里的show()函数倘若还有test1.c,test2.c,test3.c要去调用这个show()函数呢所以
单纯地使用源文件组织项目结构的时候项目越大越复杂的时候维护成本会变得越来越高
这样也就诞生了头文件 .h
.h:头文件组织项目结构的时候减少大型项目的维护成本
接下来是对维护成本的解释 还是拿刚刚的例子来举例如果说我们要把上面的v_gal改成v_gal2,那么我们是不是要把所有的源文件声明的位置进行改动如果说漏掉一个都会导致程序运行错误这里还好只有四个源文件但是如果是四十个或者四百个呢你试想一下。
综上我们都在回答一个问题为什么要有头文件
有关头文件的补充说明
.h基本上都是要被多个源文件包含的可能有一个问题头文件被重复包含的问题会导致运行效率降低
解决方案
在头文件开头写上#pragma once**PS:**在VS2022中会默认加上#pragma once)
头文件包含以下内容 C头文件 所有的变量的声明 所有的函数的声明 #define ,类型typedef, struct
在C语言中包含头文件的两种形式
#include stdio.h这种是C语言库里面要包含的头文件
#includetest.h是包含自定义的头文件
这个地方我们要特别注意的是函数的声明因为在链接的过程中test.c和main.c会进行匹配看是否有show()函数即使说你已经定义了该函数但是你没有声明的时候编译器会忽视所以要进行声明
书写如下
不向里面添加函数体道理和声明变量一个道理
注意
变量声明必须带上extern!!!
虽然在实际应用的时候编译器不会报错但是你会无法区分是开辟空间还是声明变量
函数声明建议带上extern,为什么是建议呢。因为区别在于有没有函数体编译器在识别的时候如果没有看到函数体会默认是函数的声明
几个小问题
1.全局变量可以跨文件访问吗可以
2.函数可以跨文件访问吗可以
在具体的应用场景中有没有可能我们不想让全局变量或者函数跨文件访问指向本文件内部被访问
请出我们真正的主角-------static 看上面这幅图片LNK表示的是链接的意思这里是链接错误
static int g_val 100;//全局变量访问吗可以
在具体的应用场景中有没有可能我们不想让全局变量或者函数跨文件访问指向本文件内部被访问
请出我们真正的主角-------static
[外链图片转存中…(img-pPVbonaX-1723038243763)]
看上面这幅图片LNK表示的是链接的意思这里是链接错误
static int g_val 100;//全局变量结论1static修饰全局变量该变量只能在本文件内被访问不能被外部其他文件直接访问(可以被间接访问如被函数调用)