## C语言各种变量类型应用
[TOC]
### static 定义全局变量
> 定义好的变量引用的时候都是可执行的
~~~C
int main(){
void fun();
for(int i=0;i<3;i++)
fun();
return 0;
}
void fun(){
int i=0;
static int static_i = 0; // 全局调用
printf("%d=", i);
printf("%d\n", static_i);
i++;
static_i++;
}
结果:i= 0、0、 0
static_i=0、1、2
~~~
~~~
int main(){
int num=2;
for(int i=0;i<3;i++){
printf("原始num=%d\n", num);
num++;
{
static int num=1; // 内部调用
printf("static的num=%d\n", num);
num++;
}
}
return 0;
}
结果:num=2、3、4
static num=1、2、3
~~~
### auto 定义局部变量
> 定义的局部变量不受外部变量的影响
~~~
int main() {
int num=2;
for(int i=0;i<3;i++){
printf("num变量为%d\n", num);
num++;
{
auto int num=1; // 局部变量局部使用
printf("auto变量num=%d\n", num);
num++;
}
}
return 0;
}
结果: num=2、3、4
auto num=1、1、1
~~~
### external外链属性
> C语言3种链接属性: 外部(external), 内部(internal),无设置(none)
> C语言中有3种链接属性: 外部(external), 内部(internal),无设置(none)
> 外部(external): 使用extern关键字
> 内部(internal): 使用static关键字
~~~
int a,b,c; // external 属性
void add(){
int a=3;
c=a+b;
}
int main() {
a=b=4;
add();
printf("c=%d\n", c);
return 0;
}
结果: c=7
~~~
### register变量(涉及内存CPU)
> 一般情况下,变量的值是存储在内存中的,CPU 每次使用数据都要从内存中读取。如果有一些变量使用非常频繁,从内存中读取就会消耗很多时间,例如 for 循环中的增量控制:
~~~
int i;
for(i=0; i<1000; i++){
// Some Code
}
~~~
> 执行这段代码,CPU 为了获得 i,会读取 1000 次内存。
#### 解决思路:
> 为了解决这个问题,可以将使用频繁的变量放在CPU的通用寄存器中,这样使用该变量时就不必访问内存,直接从寄存器中读取,大大提高程序的运行效率。
#### 寄存器、缓存、内存
> 为了加深对 register 变量的理解,这里有必要讲一下CPU寄存器。
> 按照与CPU的远近来分,离CPU最近的是寄存器,然后是缓存,最后是内存。
> 寄存器是最贴近CPU的,而且CPU只在寄存器中进行存取。寄存的意思是暂时存放数据,不用每次都从内存中取,它是一个临时的存放数据的空间。
> 而寄存器的数据又来源于内存,于是 CPU <-- 寄存器 <-- 内存,这就是它们之间的信息交换。
> 那么为什么还需要缓存呢?因为如果频繁地操作内存中同一地址上的数据会影响速度,于是就在寄存器和内存之间设置一个缓存,把使用频繁的数据暂时保存到缓存,如果寄存器需要读取内存中同一地址上的数据,就不用大老远地再去访问内存,直接从缓存中读取即可。
> 缓存的速度远高于内存,价格也是如此。
> 注意:缓存的容量是有限的,寄存器只能从缓存中读取到部分数据,对于使用不是很频繁的数据,会绕过缓存,直接到内存中读取。所以不是每次都能从缓存中得到数据,这就是缓存的命中率,能够从缓存中读取就命中,否则就没命中。
> 关于缓存的命中率又是一门学问,哪些数据保留在缓存,哪些数据不保留,都有复杂的算法。
> > 注意:上面所说的CPU是指CPU核心,从市场上购买的CPU已是封装好的套件,附带了寄存器和缓存,插到主板上就可以用。
关于寄存器变量有以下事项需要注意:
* 1) 为寄存器变量分配寄存器是动态完成的,因此,只有局部变量和形式参数才能定义为寄存器变量。
* 2) 局部静态变量不能定义为寄存器变量,因为一个变量只能声明为一种存储类别。
* 3) 寄存器的长度一般和机器的字长一致,所以,只有较短的类型如int、char、short等才适合定义为寄存器变量,诸如double等较大的类型,不推荐将其定义为寄存器类型。
* 4) CPU的寄存器数目有限,因此,即使定义了寄存器变量,编译器可能并不真正为其分配寄存器,而是将其当做普通的auto变量来对待,为其分配栈内存。当然,有些优秀的编译器,能自动识别使用频繁的变量,如循环控制变量等,在有可用的寄存器时,即使没有使用 register 关键字,也自动为其分配寄存器,无须由程序员来指定。
- C语言模块
- 基础入门
- 各种变量类型
- 条件编译
- 100例
- day1
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day2
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day3
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day4
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day5
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day6
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day7
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- linux基础知识
- 目录
- 系统设置
- ftp管理
- ftp-auth
- 进程
- ssh登录
- 权限属性
- 用户/用户组
- 安装命令
- 数据库操作
- 虚拟机vmvare-tools安装
- VI命令
- 上传下载
- error
- 虚拟机mac