写在最前面〖部分内容源自gnu-c-manual〗
从hello world说起
某程序员退休后决定练习书法,于是重金购买文房四宝。一日,饭后突生雅兴,一番研墨拟纸,并点上上好檀香。定神片刻,泼墨挥毫,郑重地写下一行字:hello world!
相信不少初次接触到C的朋友,都写过类似如下的代码:
#include <stdio.h> /* 为了调用标准库的printf函数 */
int main()
{
printf("hello world!\n");
return 0;
}
看到它时,内心作何感想?爱它,它让我走上了编程之路;恨它,它让我走上了编程之路。
组成C语言源程序的tokens,包含关键字、标识符、常量、操作符和分隔符等。我们来分析一下这段代码包含了哪些C语言的元素。
可以看到,五种tokens这段代码在这段短短的代码中,均有体现。我们知道,一个C程序至少要定义一个函数,而这个必须定义的函数正是main(),它的原型可能为以下三者之一:
int main(void);
int main(int argc, char * argv[]);
int main(int argc, char * argv[], char * envp[]);
其原型之中,至少包含了关键字、标识符、分隔符和操作符四种。接下来分别来看一下。
标识符
什么是标识符?有什么用?怎样表示它呢?
首先,标识符是多个字符的序列,它用来给变量、函数、新的数据类型和预处理宏 命名。可以使用字母、数字或下划线(_)来表示一个标识符,但是不能以数字开头,且大小写敏感。
1abc 不是标识符,因为它以数字“1”开头
FOO 和 foo 是不同的标识符,因为C语言中大小写敏感
如果使用GNU扩展的话,也可以在标识符中使用美元符号。
关键字
关键字是C语言保留的特殊标识符,是语言的一部分。我们不能拿关键字作其他用途。
[注]有些关键字用途未全部列出
关键字 | 说明 |
---|---|
auto | 自动变量,变量超出其作用域后,其生命自动结束 |
break | 用在循环语句中,结束当前循环,并跳出循环体 |
case | 用在switch语句中,构成一个分支 |
char | 字符类型,基本数据类型 |
const | 常量修饰符 |
continue | 用在循环语句中,结束当前循环,继续执行下一次循环 |
default | 用在switch语句中,构成默认分支 |
do | 与while组合使用,构成do...while循环 |
double | 双精确度实数类型(浮点类型),基本数据类型 |
else | 与if组合使用,构成if...else分支语句 |
enum | 枚举类型,构造类型 |
extern | 用在变量或函数前,表示变量或函数的定义在别的文件中 与“C”组合使用时, extern "C" 表示告诉编译器按C规则翻译函数名 |
float | 单精确度实数类型,基本数据类型 |
for | 用于for循环结构 |
goto | 用于跳转语句 |
if | 用于分支结构 |
int | 整型,基本数据类型 |
long | 长整型,基本数据类型 |
register | 声明变量为寄存器变量 |
return | 用于返回语句 |
short | 短整型,基本数据类型 |
signed | 有符号类型,默认类型,用于修饰char,short,int,long等小整数或整数类型变量 |
sizeof | 小心啦,这是一个披着函数外衣的关键字,用于计算类型或变量占用内存空间的字节数 |
static | 作用于变量时,修改了其存储位置和生命周期;作用于函数时,限制了其使用范围,即仅可被本文件内的函数调用 |
struct | 用于定义结构体,结构类型 |
switch | 与case,default组合,构成分支结构 |
typedef | 定义类型的别名 |
union | 用于定义共用体结构,结构类型 |
unsigned | 无符号类型,与signed相对 |
void | 空类型 |
volatile | 定义volatile变量,提示编译器操作该类型变量时,到变量地址操作,而不是使用缓存在其他地方(如寄存器)的值 |
while | 用于while或do...while循环中,构成循环结构 |
常量
常量是数字或字符的字面值。