哪个关键字和你最像,快来看看

简介: 哪个关键字和你最像,快来看看

1.最宽宏大量的关键字 - auto

首先在学auto关键字之前,我们得先了解局部变量、全局变量以及它们的作用域和生命周期


1.1局部变量

局部变量:包含在代码块中的变量叫做局部变量。局部变量具有临时性、局部性。进入代码块,自动形成局部变量,退出代码块自动释放。


注意:局部变量、自动变量、临时变量都是一回事,我们统称为局部变量


代码块:用一对花括号{}括起来的一条或多条语句叫做代码块,在语法上用{}括起来的语句视为一条语句称为代码块或者复合语句


正确示范:


#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
int main()
{
  for (int i = 0; i < 5; i++)
  {
  int j = 0;//i、j都是for循环的代码块局部变量
  printf("%d ", j);//打印5个0,j进入for循环的代码块自动形成局部变量,退出代码块自动释放。
  }
  system("pause");
  return 0;
}

错误示范:


#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
int main()
{
  for (int i = 0; i < 5; i++)
  {
  int j = 0;
  printf("%d ", j);
  }
  printf("%d ", j);//j出了for循环的代码块已经释放了,所以会报错
  system("pause");
  return 0;
}



w2.png

1.2全局变量

全局变量:在所有函数外定义的变量,叫做全局变量。全局变量具有全局性。


#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
int a = 6;//全局变量
int main()
{
  printf("%d\n", a);
  system("pause");
  return 0;
}

注意:当进入代码块,发现局部变量与全局变量同名时优先使用局部变量(main函数也是函数,也有代码块{})


#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
int a = 6;//全局变量
int main()
{
  int a = 5;//局部变量
  printf("%d\n", a);//打印局部变量5
  system("pause");
  return 0;
}

1.3变量的作用域

作用域概念:指的是该变量的可以被正常访问的代码区域


局部变量:只在本代码块内有效

全局变量:整个程序运行期间,都有效

1.4变量的生命周期

生命周期概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间”被释放“


局部变量生命周期: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量

全局变量生命周期: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效

1.5声明自动变量auto

默认的所有变量都是auto吗?


答案:当然不是,auto一般只修饰局部变量,所以的局部变量都是有auto修饰的,只不过省略了


记忆方法:局部变量又称自动变量,auto是声明自动变量,所以局部变量都是由auto声明的


结论:一般在代码块中定义的变量,即局部变量,默认都是auto修饰的,不过一般省略


注意:全局变量不能用auto修饰,否则报错


2.最快的关键字 - register

2.1存储金字塔

其实,CPU主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到CPU内,那 么也就需要CPU具有一定的数据临时存储能力。所以现代CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存。


w1.png


寄存器存在的本质:在硬件层面上,提高计算机的运算效率。因为不需要从内存里读取数据啦。


2.2register 修饰变量

作用:建议尽量将所修饰变量,放入CPU寄存区中,从而达到提高效率的目的


注意:只是建议,计算机不一定会完全执行


那么什么样的变量,可以采用register呢?


局部的(全局会导致CPU寄存器被长时间占用)

不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?)

高频被读取的(提高效率所在)

如果要使用,请不要大量使用,因为寄存器数量有限

注意: register修饰的变量,不能取地址(因为已经放在寄存区中了,地址是内存相关的概念)


结论:早期编译器需要人为指定register,来进行手动优化,现在不需要了。因为现在的计算机比较智能化,它会自动把一些使用频率比较高的放进寄存器(能够进行比人更好的代码优化)


3. 最爱打小报告的关键字 - extern

3.1认识多文件

多文件:将多个文件放在一个项目里叫做多文件


.h:我们称之为头文件,一般包含函数声明,变量声明,宏定义,头文件的包含等内容

.c: 我们称之为源文件,一般包含函数实现,变量定义等

3.2外部符号声明extern

问题:文件里的函数和全局变量可以跨文件使用吗?  


q4.png


答案:函数和全局变量可以跨文件使用,但是需要用extern进行声明。


提示:当函数不声明可以运行,但是会出现警告。当全局变量不声明,会直接保错


注意:当函数声明是前面不加extern编译器也会识别出它是声明,但全局变量声明时不加extern会被编译器理解为是在定义全局变量


#pragma once预处理指令是为了防止头文件重复包含,保证头文件只被编译一次!


先声明后使用


结论:


全局变量,是可以跨文件,被访问的。

全局函数,是可以跨文件,被访问的。

4.最名不符实的关键字 - static

4.1static修饰全局变量、函数


q3.png

static修饰全局变量,该全局变量只能在本文件内被使用。

static修饰函数,该函数只能在本文件内被使用。

static修饰全局变量、函数只影响作用域,不影响生命周期

4.2static修饰局部变量

当无static修饰时:



q2.png

当有static修饰时:



q1.png

结论:static修饰局部变量,变量的生命周期变成全局周期。(作用域不变)


局部变量经static修饰后放在了全局\静态存储区


相关文章
|
1月前
|
C#
30.C# 关键字 this初步学习
30.C# 关键字 this初步学习
15 1
|
4月前
|
C语言
百度搜索:蓝易云【如何使用C语言进行并发编程?】
需要注意的是,并发编程涉及到线程间的共享数据和同步问题,因此在实际应用中需要谨慎处理线程间的竞争条件和同步机制,以避免数据不一致和死锁等问题。
83 2
|
2月前
|
存储 编译器 C#
C#关键字常见面试题
C#关键字常见面试题
|
7月前
|
存储 编译器 C#
C#关键字相关面试题
C#关键字相关面试题
|
6月前
|
Go 开发者
终于全面掌握Go语言关键字和标识符用法 新手进阶必备 原创 Go先锋
终于全面掌握Go语言关键字和标识符用法 新手进阶必备 原创 Go先锋
31 0
终于全面掌握Go语言关键字和标识符用法 新手进阶必备 原创 Go先锋
|
编译器 程序员 Linux
【C语言】关键字的深入理解(第五期)
在进入今天的内容之前,我们先看个小故事
【C语言】关键字的深入理解(第五期)
|
存储 编译器 C语言
【C语言】关键字的深入理解(第二期)
今天我们会穿插着讲一些关键字之外的内容
【C语言】关键字的深入理解(第二期)
|
JavaScript 开发者 索引
品牌案例-根据关键字实现数组的过滤|学习笔记
快速学习品牌案例-根据关键字实现数组的过滤
122 0
|
存储 安全 Java
彻底理解 volatile 关键字及应用场景,面试必问,小白都能看懂!
彻底理解 volatile 关键字及应用场景,面试必问,小白都能看懂!
388 0
彻底理解 volatile 关键字及应用场景,面试必问,小白都能看懂!

热门文章

最新文章