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
auto默认为int。
将double值赋给它时,会报警告:从“double”转换到“int”,可能丢失数据。
c中的auto与c++中的auto含义还不一样。
感觉不太有用。
用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程。
经过 const 修饰过的变量存储在内存中的“只读数据段”中。
c中 const变量不能作为数组的长度。在 C++ 中可以!
const定义的是变量,而define定义的是常量。
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。
register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。
register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。
只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。
局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;
多余的register修饰符都将被编译程序所忽略。
现代编译器可能会忽略所有register修饰符,它自己会做决定。
防止编译器对代码进行优化。
确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
修饰被不同线程访问和修改的变量。
以前的c中的bool都是程序员自己定义的。
#define bool _Bool
#define false 0
#define true 1
_Bool大小为1byte
float _Complex、double _Complex、long double _Complex
float _Complex fCex = 1.0f + 1.0if; //实数 虚数 一起赋值
实部的获取crealf,虚部的获取cimagf
float _Imaginary、double _Imaginary、long double _Imaginary
因为_Complex(复数类型)里面已经包含虚数了,所以部分编译器都只实现了_Complex(复数类型)而没有实现_Imaginary(虚数类型)。
编译器接受建议的话,会在调用处展开内联函数,减少跳转、换页操作,提高效率。
适合简单函数。不能定义可改变的static变量。
只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。
以前往往通过编译器的编译参数指定内存对齐方式。
函数 aligned_alloc(),以及 头文件
对齐内存有利于提高程序运行效率,内存访问效率。
alignof(Foo) //值为4,对齐长度
sizeof(Foo) //结构体的总大小:12
_Atomic int i; //原子类型的变量
atomic_store(&i,12); //stdatomic.h中的宏
_Generic((var), type1:…, type2: …, ……, default:…)
#define GENERAL_ABS(x) _Generic((x),int:abs,float:fabsf,double:fabs)(x) 根据类型不同调用不同的函数,类似函数模板。
在编译时刻进行,断言表达式必须是在编译时期可以计算的表达式
除了关键字,c99c11还增加了一些函数、头文件。
在程序空间效率、时间效率、稳定性、多线程、复数、unicode、文件访问、…等需要深入考虑时,可以再来看看这些新特性、少见特性是否可以用上。