首页 > 代码库 > C语言学习笔记(一) 关键字

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不能支持这样的扩展。


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

本文出自 “飞翔的猫咪” 博客,请务必保留此出处http://flyingcat2013.blog.51cto.com/7061638/1564645

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