phantomshuttle 博客
C语言中关键字详解

由ANSI标准定义的C语言关键字共32个(C89标准):

auto double int struct break else long switch

case enum register typedef char extern return union

const float short unsigned continue for signed void

default goto sizeof volatile do if while static

此后的C99标准新增5个C语言关键字(32+5=37个)

_Bool _Complex _Imaginary inline restrict

现行的C11标准新增7个C语言关键字(32+5+7=44个)

_Alignas _Alignof _Atomic _Generic _Noreturn _Static_assert _Thread_local

根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。

一、数据类型关键字

A基本数据类型(5+1个)

  • void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
  • char:字符型类型数据,属于整型数据的一种
  • int:整型数据,通常为编译器指定的机器字长
  • float:单精度浮点型数据,属于浮点数据的一种
  • double:双精度浮点型数据,属于浮点数据的一种
  • _Bool:布尔型数据,<stdbool.h>标头定义bool为此类型的方便别名,并且还提供了true和 的宏false。_Bool 类型的变量的值只能是 0 或者 1。无论赋予任何非零值给 _Bool 类型的变量,它的值都只会是 1。

B类型修饰关键字(4+0+1个)

  • short:修饰int,短整型数据,可省略被修饰的int。
  • long:修饰int,长整形数据,可省略被修饰的int。
  • signed:修饰整型数据,有符号数据类型
  • unsigned:修饰整型数据,无符号数据类型
  • _Atomic :指定了一个新的原子类型

C复杂类型关键字(5+2+3个)

  • struct:结构体声明
  • union:共用体声明
  • enum:枚举声明
  • typedef:声明类型别名
  • sizeof:得到特定类型或特定类型变量的大小
  • _Complex:复数类型
  • _Imaginary:虚数类型
  • _Generic:泛型类型,根据参数的类型在编译时选择表达式。 这类似于 C++ 中的重载。
  • _Noreturn :它告知编译器,应用编译器的函数不返回调用方。 编译器知晓调用 _Noreturn 函数后的代码是不可访问的。 不返回的函数的一个示例为 abort。 如果控制流有可能返回调用方,则函数不能具有 _Noreturn 属性。
  • _Static_assert :静态断言,如果指定的常数表达式为 false,则编译器显示指定的消息,并且编译失败。

D存储级别关键字(6+2+3个)

  • auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配
  • static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
  • register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
  • extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的对象的一个“引用“
  • const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
  • volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
  • inline:内联函数是为了解决C 预处理器宏存在的问题所提出一种解决方案,用来提高函数使用效率。内联函数使用inline关键字定义,并且函数体和申明必须结合在一起,否则编译器将他作为普通函数对待。
  • restrict:限制指针别名的影响,有助于优化。通过添加此类型限定符,程序员向编译器提示,在指针的生命周期内,不会使用其他指针来访问它指向的对象。这允许编译器进行原本不可能进行的优化(例如向量化)。
  • _Alignas :来指定变量或用户定义类型的自定义对齐方式。参考
  • _Alignof :来获取类型或变量的首选对齐方式。返回指定类型的对齐方式(以字节为单位)。 它返回类型为 size_t 的值。参考
  • _Thread_local:线程存储期,对象的存储是在线程开始时分配,线程结束时回收,每个线程有该对象自己的实例。

二、流程控制关键字

A跳转结构(4个)

  • return:用在函数体中,返回特定值(或者是void值,即不返回值)
  • continue:结束当前循环,开始下一轮循环
  • break:跳出当前循环或switch结构
  • goto:无条件跳转语句

B分支结构(5个)

  • if:条件语句
  • else:条件语句否定分支(与if连用)
  • switch:开关语句(多重分支语句)
  • case:开关语句中的分支标记
  • default:开关语句中的“其他”分治,可选。

C循环结构(3个)

  • for:for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2…循环,其中2为循环条件
  • do:do循环结构,do 1 while(2);的执行顺序是1->2->1…循环,2为循环条件
  • while:while循环结构,while(1) 2;的执行顺序是1->2->1…循环,1为循环条件

以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。

补充:C语言中没有 string ,要想在C语言中使用字符串,就要在头文件里定义#include<string.h>(引用)而字符串在c++里的定义是#include<string>;在C/C++中使用字符串也就是定义时不一样,其他的都一样。string 是字符串,char是单个的字符。string相当于一个容器,char可以放在里面。string有结束符,char是没有的。string是c++里的,不是c里的。用string存储字符串时,不用设定字符串的长度,而char要设定。还有就是,string有很强很方便的功能,比如可以方便的赋值,方便的比较大小。

C99 新增了复数类型(_Complex)和虚数类型(_Imaginary)。简单来说,C99 提供了三种复数类型:float _Complex,double _Complex,和 long double _Complex。对于 float _Complex类型的变量来说,它包含两个 float类型的值,一个用于表示复数的实部(real part),另一个用于表示虚部(imaginary part)。类似地,double _Complex 包含两个 double类型的值。C99 也提供了三种虚数类型:float _Imaginary,double _Imaginary,以及 long double _Imaginary。虚数类型只有虚部,没有实部。

包含标准头文件 complex.h 后,我们就可以用 complex来代表 _Complex,用imaginary来代表 _Imaginary,以及用 I来代表虚数单位 i,也就是 -1的平方根。例如:

#include <complex.h>

double _Complex x = 5.2;

double complex y = 5.0 * I;

double complex z = 5.2 – 5.0 * I;

注意:_Complex类型对于独立式环境(freestanding environment)来说是可选的。可选的意思是,不强制必须支持这种类型。而所谓独立式环境,是指 C 程序可以在没有操作系统的情况下运行。_Imaginary类型在任何环境下都是可选的。目前的编译器对这两种类型的支持都不太好,在此就不对这两种类型进行更深入的讨论了

发表回复

textsms
account_circle
email

phantomshuttle 博客

C语言中关键字详解
由ANSI标准定义的C语言关键字共32个(C89标准): auto double int struct break else long switch case enum register typedef char extern return union const float short uns…
扫描二维码继续阅读
2024-01-30