今天开始,准备重新学习下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不能支持这样的扩展。
关于基本关键字就介绍到这里。
转载于:https://blog.51cto.com/flyingcat2013/1564645