c89、c99、c11关键字学习

c关键字:

auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,register,return,short,signed,sizeof,static,struct,switch,typedef,unsigned,union,void,volatile,while

不常见的c关键字:

auto:声明自动变量

auto默认为int。
将double值赋给它时,会报警告:从“double”转换到“int”,可能丢失数据。
c中的auto与c++中的auto含义还不一样。
感觉不太有用。

const:声明只读变量

用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程。
经过 const 修饰过的变量存储在内存中的“只读数据段”中。
c中 const变量不能作为数组的长度。在 C++ 中可以!
const定义的是变量,而define定义的是常量。

extern:声明变量或函数是在其它文件或本文件的其他位置定义

goto:无条件跳转语句

register:声明寄存器变量

register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。
register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。
register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。
只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。
局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;
多余的register修饰符都将被编译程序所忽略。
现代编译器可能会忽略所有register修饰符,它自己会做决定。

sizeof:计算数据类型或变量长度(即所占字节数)

volatile:说明变量在程序执行中可被隐含地改变

防止编译器对代码进行优化。
确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
修饰被不同线程访问和修改的变量。

C99 新增关键字

_Bool:布尔类型

以前的c中的bool都是程序员自己定义的。
#define bool _Bool
#define false 0
#define true 1
_Bool大小为1byte

_Complex:复数类型

float _Complex、double _Complex、long double _Complex
float _Complex fCex = 1.0f + 1.0if; //实数 虚数 一起赋值
实部的获取crealf,虚部的获取cimagf

_Imaginary:虚数类型

float _Imaginary、double _Imaginary、long double _Imaginary
因为_Complex(复数类型)里面已经包含虚数了,所以部分编译器都只实现了_Complex(复数类型)而没有实现_Imaginary(虚数类型)。

inline:内联

编译器接受建议的话,会在调用处展开内联函数,减少跳转、换页操作,提高效率。
适合简单函数。不能定义可改变的static变量。

restrict:限定指针

只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。

C11 新增关键字

_Alignas:内存对齐指示符

以前往往通过编译器的编译参数指定内存对齐方式。

_Alignof:对齐处理操作符

函数 aligned_alloc(),以及 头文件
对齐内存有利于提高程序运行效率,内存访问效率。
alignof(Foo) //值为4,对齐长度
sizeof(Foo) //结构体的总大小:12

_Atomic:原子操作

_Atomic int i; //原子类型的变量
atomic_store(&i,12); //stdatomic.h中的宏

_Generic:泛型

_Generic((var), type1:…, type2: …, ……, default:…)
#define GENERAL_ABS(x) _Generic((x),int:abs,float:fabsf,double:fabs)(x) 根据类型不同调用不同的函数,类似函数模板。

_Noreturn:指定该函数不返回到其调用点。

_Static_assert:静态断言

在编译时刻进行,断言表达式必须是在编译时期可以计算的表达式

_Thread_local:限定了变量不能在多线程之间共享

其它

除了关键字,c99c11还增加了一些函数、头文件。
在程序空间效率、时间效率、稳定性、多线程、复数、unicode、文件访问、…等需要深入考虑时,可以再来看看这些新特性、少见特性是否可以用上。

你可能感兴趣的:(cpp)