今天开始,准备重新学习下C语言。虽然自己了解C语言语法,但总觉得理解得很不够。由于各种原因,以前对C语言的研究总是不能坚持,但这次希望自己能够做得更好。这里推荐下《C语言深度剖析》这本书,如果有其他好书,也请各位推荐,不胜感谢!
本文主要总结C语言的关键字,并对一些特殊的关键字进行介绍,对于static、extern等比较复杂的关键字后面单独总结。
究竟有多少个关键字?
C语言的关键字不像其他语言,关键字不是很固定。(关于C89和C99,以后会写文章总结)C89定义的关键字有以下32个:关键字含义关键字含义关键字含义
auto自动变量void空类型short短整型变量
int整型变量long长整型变量char字符型变量
signed有符号类型变量unsigned无符号类型变量float浮点型变量
double双精度变量register寄存器变量static静态变量
extern外部引用变量const只读变量volatile隐式可变变量
enum枚举类型struct结构体类型union联合数据类型
switch开关语句case开关语句分支default开关默认分支
do循环体while循环条件for循环语句
break跳出当前循环continue结束当次循环return返回语句
if条件语句else条件否定分支goto无条件跳转
typedef重命名类型sizeof计算对象大小
C99增加了一个inline(内联)关键字。
C11最终草案n1570文档中,还增加了restrict、_Alignas、_Alignof、_Atomic、_Bool、_Complex、_Generic、_Imaginary、_Noreturn、_Static_assert、_Thread_local这么一些关键字,这当然是后话了。
最快的变量:register变量
这个关键字声明将变量尽可能放在寄存器中。受寄存器的大小和个数等限制,该关键字并不总是有效。使用时应该注意:
并非声明了register就一定会在寄存器中。
register变量必须是能被 CPU 寄存器所接受的类型。意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。
register变量可能不存放在内存中, 所以不能用取址运算符“&”来获取register变量的地址。
sizeof是关键字
由于sizeof使用上的特殊性(一般会有括号),常常被误认为是一个标准函数,但其实际上是一个关键字。而且这个括号并不总是必须的,看以下代码:int i; //32位系统下
sizeof(int) //4
sizeof(i); //4
sizeof int; //编译出错
sizeof i; //4
也就是说,sizeof在计算变量大小时可以省略括号,但计算类型大小时不可以省略。当然,通常还是提倡一律加上括号。
enum类型
C语言中的枚举类型一般定义如下:enum enum_type_name{
ENUM_CONST_1,
ENUM_CONST_2,
//...
ENUM_CONST_n;
}enum_var_name;
其中,enum_type_name为枚举类型名,enum_var_name是变量名。
枚举常量可以显式赋值。如果不赋值则会从被赋初值的那个常量开始依次加 1,如果都没有赋值,它们的值从 0 开始依次递增 1。例如定义三原色的枚举:enum PrimaryColor{
RED, //0
GREEN=10, //10
BLUE //11
}color;
枚举和#define宏的区别主要有:#define宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值。
一般在编译器里可以调试枚举常量但是不能调试宏常量。
枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个。
typedef不支持基本类型扩展
下面是一个例子,说明typedef和#define又有区别:A) #define int int32;
unsigned int32 i=10; //OK
B) typedef int int32;
unsigned int32 i=10; //编译出错
使用#define定义的别名由于是直接替换因此A很好理解,但很可惜,typedef不能支持这样的扩展。
关于基本关键字就介绍到这里。