C语言学习笔记(一) 关键字

今天开始,准备重新学习下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宏的区别主要有:

  1. #define宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值。

  2. 一般在编译器里可以调试枚举常量但是不能调试宏常量。

  3. 枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个。


typedef不支持基本类型扩展

下面是一个例子,说明typedef和#define又有区别:

A)    #define int int32;
      unsigned int32 i=10;        //OK

B)    typedef int int32;
      unsigned int32 i=10;        //编译出错

使用#define定义的别名由于是直接替换因此A很好理解,但很可惜,typedef不能支持这样的扩展。


关于基本关键字就介绍到这里。

你可能感兴趣的:(关键字,C语言,register,C语言学习笔记)