C语言关键字汇总

1.关键字的分类

<1>数据类型关键字(12个)

char :声明字符型变量或函数
short :声明短整型变量或函数
int : 声明整型变量或函数
long :声明长整型变量或函数
signed :声明有符号类型变量或函数
unsigned :声明无符号类型变量或函数
float :声明浮点型变量或函数
double :声明双精度变量或函数
struct :声明结构体变量或函数
union :声明共用体(联合)数据类型
enum :声明枚举类型
void :声明函数无返回值或无参数,声明无类型指针

<2>控制语句关键字(12个)

1. 循环控制(5个)
for :一种循环语句
do :循环语句的循环体
while :循环语句的循环条件
break :跳出当前循环
continue :结束当前循环,开始下一轮循环
2. 条件语句(3个)
if : 条件语句
  else :条件语句否定分支   
goto :无条件跳转语句
3. 开关语句 (3个)
switch :用于开关语句
case :开关语句分支
default :开关语句中的 其他 ”分支
4. 返回语句(1个)
return :函数返回语句 ( 可以带参数,也看不带参数)

<3>存储类型关键字(5个)

auto :声明自动变量,一般不使用
extern :声明变量是在其他文件中声明
register :声明寄存器变量
static :声明静态变量
typedef :用以给数据类型取别名 (但是该关键字被分到存储关键字分类中,虽然看起来没什么相关性) 存储关键字,不可以同时出现,也就是说,在一个变量定义的时候,只能有一个。

<4>其他关键字(3个)

const :声明只读变量
sizeof :计算数据类型长度
volatile :说明变量在程序执行中可被隐含地改变    
以上是对c语言的关键字进行的详细分类,这些关键字涵盖了基本C语言所有的内容,为了对后面对语句,自定义类型,以及文件操作,栈堆空间上的理解等做详细的介绍,以下的内容从关键字开始征程。

2.最宽宏大量关键字auto的理解

使用:一般在代码中定义的变量,即局部变量,默认都是auto修饰的,不过一般省略。但并非所有变量都是auto。

结论:已经很老,基本永不使用。

3.最快的关键字register的理解

使用:尽量将变量放入寄存器,从而达到提高运算效率。

补充知识:cpu是主要负责计算的硬件单元,但为了方便计算,一般第一步需要先把数据从内存读取到CPU内,那么就需要cpu也具有一定的数据储存能力,故现代cpu中形成了一套叫寄存器的硬件器。

当 cpu访问数据的时候,会以最小的成本,达到最高效率。下面是存储金字塔的示意图:

其中,寄存器是指cpu内集成了一组存储硬件 ,其寄存器存在的本质在硬件层面上,能提高计算机的运算效率,因为不需要从内存中去读取数据。(register是直接将变量放到cpu中去直接计算)。

回到正题,对于什么样的变量可以采取register修饰呢?

1. 局部的(全局会导致CPU寄存器被长时间占用) 2. 不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?) 3. 高频被读取的(提高效率所在) 4. 如果要使用,请不要大量使用,因为寄存器数量有限。

最后一点就是对于register修饰的变量,不能取地址,因为其变量已经放在寄存区中了,地址是内存相关的概念。

结论:register会尽量将变量放入寄存器,从而达到提高运算效率。

4.最稳健的关键字static的深刻理解

static的主要作用是为了维护项目的安全性。接下来我将从3个维度去进行刨析:首先static可以修饰局部变量,原本变量会在栈区去开辟空间,但修饰之后会将变量存储到静态区,改变的是变量的生命周期,并不是作用域,因为其在栈上开辟的空间在使用完会自动释放,而在静态区存储的变量相当于全局变量,会持续存在到程序执行完毕才释放变量所占的空间。其次static可以修饰全局变量,其作用是改变了该全局变量的链接属性,使得原有可以在其他源文件内部使用的全局变量只能在本源文件使用,提高了项目的安全性。最后还可以修饰函数,其作用与修饰全局变量的一样,在此就不多叙述了。

结论:static的主要作用是为了维护项目的安全性

5.最冤枉的关键字sizeof的理解

首先要明确其sizeof是一个关键字,而不是函数。在这里就区分以下与strlen的区别:strlen 函数用于计算字符串的长度,只统计字符串中字符的数量,不包括结尾的空字符。而 sizeof 操作符用于计算变量或类型的大小,一般单位为字节,通常用于计算内存大小。 所以使用的场景不同,strlen主要是用于计算字符串的长度,sizeof是用于计算内存占用。

6.signed,unsigned关键字的深刻理解

在了解这两个关键字前,我们一定会疑惑为什么要对数据进行有无符号区分,所以我会先从与原码,反码,补码的理解开始,再对关键字进行解释。首先计算机中的数据存在有符号数和无符号之分,对于负数,其反码会通过对原码进行按位取反,符号位不变的操作得到,补码则需对反码+1即可。对于正数,其原码,反码,补码一样。对于计算机中的无符号数,其不需要符号位,原码反码补码一样。其次我们已知变量的本质是会开辟一块空间用来保存数据,又计算机的运算是以二进制补码的形式进行(程序猿的智慧结晶),那么就可以理解计算机对于变量会先有空间,后有内容,再将内容转化成二进制补码的数据进入相应空间。当我们在理解有无符号关键字时,其实本质就是在理解数据在存入和取出时的差别,结论是当数据进行存储的时候,空间是不会关心内容的,数据的存储是与前修饰类型无关的,而数据在用户取时起决定作用。这里举个例子:就好像你跟人说你有100元,但如果你不加美元人名币等等的前缀,别人是不能明白你手中钱的价值到底值多少。你再联想下前面所讲的强制类型转换,改变的是我们看待数据的角度,但本身数据是不会改变的,那么其对应的二进制补码数据会因不同类型修饰而改变吗?答案毫无疑问。

结论:当数据进行存储的时候,空间是不会关心内容的,数据的存储是与前修饰类型无关的,而数据在用户取时起决定作用。

7.条件分支语句中关键字的深刻理解

这里会针对条件分支语句进行刨析,中间会夹杂着各个条件关键字(后面就不对分支语句进行单独分析了)。

首先是if语句,其会先执行()中的表达式(可能时语句也可能是函数),然后得到对表达式的真假判断,再进行分支功能。这里if,else要注意几点:1.else会与最近的if语句进行匹配,所以程序猿采用大括号规范if要执行的代码区是一项优秀的素养,增强代码的可读性(vs会对代码进行缩进调整,可能会使代码的运行顺序改变)。2.在()中的表达式里,最好将n==5写成5==n,这样在你写成赋值操作时程序会直接报错提醒。

结论: 1.C0表示假,非0表示真if语句执行;先执行完成表达式的值,得到逻辑结果,在进行判定。2.if else的就近原则需要注意。

switch语句也是一种分支语句,常常用于多分支的情况。这种多分支,一般指的是很多多分支,而且判定条件主要以整型为主,之间case执行判断,break执行分支。其switch的基本结构是(整型变量/整形表达式),定义时注意case break之间不能定义变量,否则会报错;case表达式之后必须是个整型变量(数字),使用时建议按字母顺序排序case;正常情况在前,异常情况在后;建议按执行频率放置case,尽量不经常使用default,就算使用也建议放在最后。switch可以嵌套,break会直接跳出当前循环结束该次循环,而continue会跳出剩余代码,并重新返回到判断条件处。

结论:当case:执行语句==1:n时,case多条语句(不能定义变量,如果需要使用{}和函数完成实现);当case:执行语句==n:1时,多条case后不写break。

8.四大皆空void关键字的深刻理解

我会从变量,函数,指针三个角度去分析void的修饰。在此之前需明确的是void类型大小不确定,现象是在vs是0字节大小,但在linux中是1字节大小。

首先void可以修饰变量,其根本原因是void类型被编译器定义为空类型。但C语言中强制的不允许其定义变量(注意void修饰的是可定义变量),因为前面学习了定义变量的本质是开辟空间,就算开辟空间,也作为一个占位符(占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号,广泛用于计算机中各类文档的编辑)看待。

当void修饰函数返回值有如下作用:1.占位符,让用户明确函数不需要返回值。2.告知编译器这个返回值无法接受。当void充当函数的形参列表时,告知用户该函数不需要传参。

当void修饰指针时,首先void*是指针(其大小在32位平台是4个字节大小,64位平台是8个字节大小),void*即可被任何类型的指针接受(如果要通过 void 指针去获取它所指向的变量值时候,需要先将 void 指针强制类型转换成和变量名类型相匹配的数据类型指针后再进行操作。任何类型的指针都可以赋值给 void 指针,无需进行强制类型转换。),也可以接受任意指针类型。但void*不能进行指针计算,因为指针进行加减运算,会在原地址基础上加减相应指针类型大小,但像之前所说void大小不明确(Linux可以,vs不可以)。最后C语言不能对void*的指针进行解引用。

9.关键字const的深刻理解

const可以修饰只读变量(不是常量,c++可以,c不可以),数组,指针,函数,函数参数,以下我会从各个方面介绍const的作用。首先const修饰变量,其修饰的变量不能直接被修改,被称为只读变量,但可以通过指针取间接修改(真正意义上的不可修改是操作系统的直接报错,或许编译器会允许你的程序编过,但操作系统会直接将你拒之门外),其意义在于1.让编译器进行直接修改式检查2.告诉其他程序猿这个变量后续不要改动;当修饰全局变量时,其作用是防止不必要的人为修改,使用的方法与局部变量是相同的。其次是数组,其结果是数组的每个元素不可以被修改,这种被称为只读数组。在修饰指针时,准确来说是修饰指针变量(前面对变量涉及到左值和右值两个概念),首先看如下代码

const int* p = &a;//const修饰的*p(p指向的内容无法被修改)
int const* p = &a;//和第一条等价
int* const p = &a;//1.p指向的目标不能直接被修改。2.p指向的内容不能直接被修改
const int* const p = &a;//和第三条等价

然后是const修饰的函数,其作用有如下1.防止修改指针指向的内容2.防止修改指针指向的地址。最后修饰的函数的返回值,其作用是函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

10.易变的关键字volatile的深刻理解

对于 const volatile int a=10代码来说,在vs2013中和gcc 4.8中都能编译过,const是在编译期间起效果,volatile是在编译期间主要影响编译器,形成不优化的代码,进而影响运行,故volatile编译和运行都起效果。const要求你不要进行写入就可以,volatile意思是你读取的时候,每次都要从内存去读,两者并不冲突。虽然volatile叫易变关键字,但这里仅仅是描述它修饰的变量可能会变化,要求编译器注意,并不是它要求对应变量变化。

结论:volatile忽略编译器的优化,保持内存可视性,防止内存被覆盖。

11.extern在多文件下的理解和使用

extern int a;显式的说明了a的存储空间是在程序的其他地方分配的,在文件中其他位置或者其他文件中寻找a这个变量。

结论:extern表明变量或者函数是定义在其他其他文件中的。

12.typedef关键字的理解

C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,有以下用法: 对一般类型进行重命名  对结构体类型进行重命名  对指针进行重命名  对复杂结构进行重命名。

typedef 与 #define的区别

typedef int COUNT

#define COUNT int

typedef定义一种新的数据类型(COUNT),它是已有类型(int)的别名。在编译时COUNT类型与int类型相同;#define定义一个宏(COUNT),在预编译时,把字符串COUNT替换为字符串int.

以上就是对C语言常见关键字的总结概括,若有不足,请不惜赐教。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只爱喝coke的小鳄鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值