C语言深度解剖篇之关键字以及补充内容

目录
  • 关键字分类
  • 补充内容
    • 第一个C程序
    • 定义与声明
      • 变量
      • 变量的分类
      • 变量的作用域
      • 变量的生命周期
      • 作用域 vs 生命周期
  • 最宽宏大量的关键字 - auto
  • 最快的关键字 - register
    • 存储金字塔
    • 寄存器的认识
    • 寄存器存在的本质
    • register 修饰变量
  • 写在最后

关键字分类

一般的书上,C语言的关键字都是32个,但是这个都是 C90(C89) 的标准。其实 C99 后又新增了5个关键字。不过,目前主流的编译器,对 C99 支持的并不好,按照C90标准 ,即认为32个。

关键字 说明
auto 声明自动变量
short 声明短整型变量或函数
int 声明整型变量或函数
long 声明长整型变量或函数
float 声明浮点型变量或函数
double 声明双精度变量或函数
char 声明字符型变量或函数
struct 声明结构体变量或函数
union 声明共用数据类型
enum 声明枚举类型
typedef 用以给数据类型取别名
const 声明只读变量
unsigned 声明无符号类型变量或函数
signed 声明有符号类型变量或函数
extern 声明变量是在其他文件正声明
register 声明寄存器变量
static 声明静态变量
volatile 说明变量在程序执行中可被隐含地改变
void 声明函数无返回值或无参数,声明无类型指针
if 条件语句
else 条件语句否定分支(与 if 连用)
switch 用于开关语句
case 开关语句分支
for 一种循环语句
do 循环语句的循环体
while 循环语句的循环条件
goto 无条件跳转语句
continue 结束当前循环,开始下一轮循环
break 跳出当前循环
default 开关语句中的“其他”分支
sizeof 计算数据类型长度
return 子程序返回语句(可以带参数,也可不带参数)循环条件

补充内容

第一个C程序

#include<stdio.h>
#include<windows.h>//windows.h系统头文件,仅仅是为了停屏
int main()
{
	printf("hello world!\n");
	system("pause");//pause停屏
	return 0;
}

文件代码在进行生成解决方案后会转换成可执行程序(二进制文件 .exe)

可以通过清空解决方案来清空可执行程序

  • 在windows中,双击的本质运行程序,将程序加载到内存中。
  • 任何程序在被被运行之前都必须被加载到内存当中。
  • 加载到内存中,速度快。

冯诺依曼

定义与声明

变量

在内存中开辟特定大小的空间,用来保存数据

变量的定义

类型  变量名 = 默认值
int a = 10;
char c = 'c';

定义变量的原因:因为有数据需要暂时被保存起来,等待后续处理。

变量的本质

  • 所有的变量的本质都是要在内存的某个位置开辟空间的。
  • 程序运行,需要加载到内存中
  • 程序计算,需要使用变量

定义变量的本质:在内存中开辟一块空间,用来保存数据。(为何一定是内存:因为定义变量,也是程序逻辑的一部分,程序已经被加载到内存)

定义:开辟空间,只能有一次。

声明:告知,可以多次。

int a = 10;//a的定义
a = 20;//赋值
a = 100;//赋值

变量的分类

变量分为:局部变量和全局变量

局部变量:包含在代码块中的变量叫做局部变量。局部变量具有临时性。进入代码块,自动形成局部变量,退出代码块自动释放。[网上很多说函数中的变量是局部变量,不能说错,但说法是不准确的](定义在代码块内)

全局变量:在所有函数外定义的变量,叫做全局变量。全局变量具有全局性。(定义在代码块外)
代码块:用{}括起来的区域,就叫做代码块

#include<stdio.h>
int g_val = 100;//全局变量
int main()
{
	int a = 10;//局部变量,main函数也是函数,也有代码块{}
	if(a == 10)
	{
		int b = 10;//局部变量
    }
	printf("a=%d\n", a);
	return 0;
}

变量的作用域

作用域:指的是该变量的可以被正常访问的代码区域。
局部变量:只在本代码块内有效。
全局变量:整个程序运行期间,都有效。

其中全局变量:

  • 在任何代码块中都可以被访问
  • 在任何代码块中都可以被访问,甚至被修改。
  • 当全局变量与局部变量同名时,局部变量优先。
#include<stdio.h>
int g_vax = 10;//全局变量
void test()
{
	int g_val = 100;//局部变量的g_val只能在本代码被访问
	printf("%d\n", g_val);//在全局变量g_val任何代码块中都可以被访问,甚至被修改
	//输出的是局部,也就是局部和全部同名的时候,优先局部。
}
int main()
{
	test();
	printf("%d\n", g_vax);//在任何代码块中都可以被访问
	return 0;
}

变量的生命周期

生命周期概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间”被释放“。
局部变量: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量。
全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效。

作用域 vs 生命周期

作用域:衡量变量影响的范围,该变量的有效作用域。
生命周期:描述的是变量生存时间的长短。时间的概念:什么时候被开辟,什么时候被释放。

最宽宏大量的关键字 - auto

如何使用:一般在代码块中定义的变量,即局部变量,默认都是auto修饰的,不过一般省略。
默认的所有变量都是auto吗?不是,一般用来修饰局部变量
局部变量包括自动变量,临时变量和局部变量。

#include <stdio.h>
int main()
{
	for (int i = 0; i < 10; i++) //局部变量i也可以被auto修饰
	{
		printf("i=%d\n", i);
		if (1)
		{
			auto int j = 0;//自动变量
			printf("before: j=%d\n", j);
			j += 1;
			printf("after : j=%d\n", j);
		}
	}
	return 0;
}

auto已经很老,基本上不使用了。

最快的关键字 - register

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

存储金字塔

距离CPU越近的存储硬件,速度越快。

寄存器的认识

CPU内集成了一组存储硬件即可,这组硬件叫做寄存器。

寄存器存在的本质

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

register 修饰变量

尽量将所修饰变量,放入CPU寄存区中,从而达到提高效率的目的
那么什么样的变量,可以采用register呢?
1.局部的(全局会导致CPU寄存器被长时间占用)
2.不会被写入的(写入就需要写回内存,后续还要读取检测的话,就无意义了)
3.高频被读取的(提高效率所在)
4.如果要使用,请不要大量使用,因为寄存器数量有限
5.register修饰的变量,不能取地址(因为已经放在寄存区中了嘛,地址是内存相关的概念)

寄存器–cache–内存–SSD/flash/硬盘–光盘–磁盘

硬盘通过缓存技术成内存,内存通过缓存技术成寄存器。

距离CPU越近的储存单元,效率越高,单价成本越高。

距离CPU越远的储存单元,效率越低,单价成本越便宜。

对任何一种硬件而言,充当上游硬件的缓存。

例:内存可以看成硬盘的一个大缓存;cache和寄存器相当于内存某一种缓存。

CPU访问数据的时,以最小的成本达到最高的效率。

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

写在最后

到此这篇关于C语言深度解剖篇之关键字以及补充内容的文章就介绍到这了,更多相关C语言关键字及补充内容内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言按关键字搜索文件夹中文件的方法

    本文实例讲述了C语言按关键字搜索文件夹中文件的方法.分享给大家供大家参考.具体实现方法如下: 方法1: #include<iostream> #include<string> #include<io.h> using namespace std; void filesearch(string path,string mode) { struct _finddata_t filefind; if(path[path.size()-1]=='\\') path.resize

  • 详解C语言正确使用extern关键字

    利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例,分类说明一下. 一.引用同一个文件中的变量 #include<stdio.h> int func(); int main() { func(); //1 printf("%d",num); //2 return 0; } int num = 3; int func() { printf("%d\n",num); } 如果按照这个顺序,变量 num在main函

  • 详解C语言中const关键字的用法

    关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下的优点: 1.预编译指令只是对值进行简单的替换,不能进行类型检查 2.可以保护被修饰的东西,防止意外修改,增强程序的健壮性 3.编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编

  • C语言关键字大全(共32个)

    C语言一共有32个关键字,如下所述: auto :声明自动变量 short :声明短整型变量或函数 int: 声明整型变量或函数 long :声明长整型变量或函数 float:声明浮点型变量或函数 double :声明双精度变量或函数 char :声明字符型变量或函数 struct:声明结构体变量或函数 union:声明共用数据类型 enum :声明枚举类型 typedef:用以给数据类型取别名 const :声明只读变量 unsigned:声明无符号类型变量或函数 signed:声明有符号类型

  • 一篇文章带你了解C语言中volatile关键字

    目录 C语言中volatile关键字 总结 C语言中volatile关键字 volatile关键字是C语言中非常冷门的关键字,因为用到这个关键字的场景并不多. 当不用这个关键字的时候,CPU可能会对我们的代码做一定的优化: 内存中的数据要放入CPU中进行运算或控制,而这个数据的值是被放入寄存器中,然后再将寄存器中的数据进行运算或控制的,对于一个死循环int flag=1;while(flag);来说:如果进行优化,则下次循环则不需要再次将flag内存中的值放入寄存器中,而是直接使用寄存器中已有的

  • 探讨C语言中关键字volatile的含义

    volatile 的意思是"易失的,易改变的".这个限定词的含义是向编译器指明变量的内容可能会由于其他程序的修改而变化.通常在程序中申明了一个变量时,编译器会尽量把它存放在通用寄存器中,例如ebx.当CPU把其值放到ebx中后就不会再关心对应内存中的值.若此时其他程序(例如内核程序或一个中断)修改了内存中它的值,ebx中的值并不会随之更新.为了解决这种情况就创建了volatile限定词,让代码在引用该变量时一定要从指定位置取得其值. 关键字volatile有什么含意?并给出三个不同的例

  • 浅析C语言中typeof关键字用法

    前言 C语言中 typeof 关键字是用来定义变量数据类型的.在linux内核源代码中广泛使用. 下面是Linux内核源代码中一个关于typeof实例: #define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; }) 1.当x的类型为是 int 时 _min1变量的数据类型则为

  • C语言关键字auto与register的深入理解

    关键字概述很多朋友看到这儿可能会有疑问,往往其它讲C语言的书籍都是从HelloWorld,数据类型开始C语言学习的,为什么我们要从C语言的关键字开始呢?关于这点,我有两点需要说明:本章节面向的读者对象是有一定的C语言基础知识的朋友(至少应该学习过大学里的C语言程序设计等类似的课程)本章节结合了作者多年嵌入式工作.研究.教学经验而作,由计算机底层硬件到上层软件设计融会贯通,中间有大量的深入浅出的示例 在我对C语言进行培训的时候,往往就是从C语言的关键字入手,因为C语言的关键字蕴含了C语言的全部的词

  • C语言关键字union的定义和使用详解

    union,中文名"联合体.共用体",在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量. 但在"联合"中, 各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度 .一个联合体类型必须经过定义之后, 才能使用它,才能把一个变量声明定义为该联合体类型. 当定义结构对象时,如果没有显式地初始化它们,则会采用一般初始化规则:如果该结构对象属于动态存储类型,那么其成员具有不确定的初始值

  • 详解C++中的const关键字及与C语言中const的区别

    const对象默认为文件的局部变量,与其他变量不同,除非特别说明,在全局作用域的const变量时定义该对象的文件局部变量.此变量只存在于那个文件中中,不能别其他文件访问.要是const变量能在其他文件中访问,必须显示的指定extern(c中也是)   当你只在定义该const常量的文件中使用该常量时,c++不给你的const常量分配空间--这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c = 0:相当于#define c 0:    当在当前文件之外使用

随机推荐