表(1.1)C语言标准定义的32个关键字
关键字 意 义
auto 声明自动变量,缺省时编译器一般默认为
int 声明整型变量
double 声明双精度变量
long 声明长整型变量
char 声明字符型变量
float 声明浮点型变量
short 声明短整型变量
signed 声明有符号类型变量
unsigned 声明无符号类型变量
struct 声明结构体变量
union 声明联合数据类型
enum 声明枚举类型
static 声明静态变量
switch 用于开关语句
case 开关语句分支
default 开关语句中的“其他”分支
break 跳出当前循环
register 声明寄存器变量
const 声明只读变量
volatile 说明变量在程序执行中可被隐含地改变
typedef 用以给数据类型取别名(当然还有其他作用)
extern 声明变量是在其他文件正声明(也可以看做是引用变量)
return 子程序返回语句(可以带参数,也可不带参数)
void 声明函数无返回值或无参数,声明空类型指针continue结束当前循环,开始下一轮循环
do 循环语句的循环体
while 循环语句的循环条件
if 条件语句
else 条件语句否定分支(与if连用)
for 一种循环语句(可意会不可言传)
goto 无条件跳转语句
sizeof 计算对象所占内存空间大小
1.1,最宽恒大量的关键字----autoauto:它很宽恒大量的,你就当它不存在吧。编译器在默认的缺省情况下,所有变量
都是auto的。
1.2,最快的关键字---- register
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中而不是通过内
存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个CPU的寄存器也就那么
几个或几十个,你要是定义了很多很多register变量,它累死也可能不能全部把这些变量放
入寄存器吧,轮也可能轮不到你。
1.2.1,皇帝身边的小太监----寄存器
不知道什么是寄存器?那见过太监没有?没有?其实我也没有。没见过不要紧,见过就
麻烦大了。^_^,大家都看过古装戏,那些皇帝们要阅读奏章的时候,大臣总是先将奏章交
给皇帝旁边的小太监,小太监呢再交给皇帝同志处理。这个小太监只是个中转站,并无别
的功能。
好,那我们再联想到我们的CPU。CPU不就是我们的皇帝同志么?大臣就相当于我们
的内存,数据从他这拿出来。那小太监就是我们的寄存器了(这里先不考虑CPU的高速缓
存区)。数据从内存里拿出来先放到寄存器,然后CPU再从寄存器里读取数据来处理,处理
完后同样把数据通过寄存器存放到内存里,CPU不直接和内存打交道。这里要说明的一点
是:小太监是主动的从大臣手里接过奏章,然后主动的交给皇帝同志,但寄存器没这么自觉,
它从不主动干什么事。一个皇帝可能有好些小太监,那么一个CPU也可以有很多寄存器,
不同型号的CPU拥有寄存器的数量不一样。
为啥要这么麻烦啊?速度!就是因为速度。寄存器其实就是一块一块小的存储空间,只
不过其存取速度要比内存快得多。进水楼台先得月嘛,它离CPU很近,CPU一伸手就拿到
数据了,比在那么大的一块内存里去寻找某个地址上的数据是不是快多了?那有人问既然
它速度那么快,那我们的内存硬盘都改成寄存器得了呗。我要说的是:你真有钱!
1.2.2,使用 register 修饰符的注意点
虽然寄存器的速度非常快,但是使用register修饰符也有些限制的:register变量必须是
能被CPU寄存器所接受的类型。意味着register变量必须是一个单个的值,并且其长度应小
于或等于整型的长度。 而且register变量可能不存放在内存中,所以不能用取址运算符“&”
来获取register变量的地址。
1.3,最名不符实的关键字----static
不要误以为关键字static很安静,其实它一点也不安静。这个关键字在C语言里主要有
两个作用,C++对它进行了扩展。1.3.1,修饰变量
第一个作用:修饰变量。变量又分为局部和全局变量,但它们都存在内存的静态区。
静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern声明也没法
使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些
代码行也不能使用它。想要使用就得在前面再加extern ***。恶心吧?要想不恶心,很简单,
直接在文件顶端定义不就得了。
静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他
函数也用不了。由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结
束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。
static int j;
void fun1(void){
static int i = 0;
i ++;
}
void fun2(void){
j = 0;
j++;
}
int main()
{
for(k=0; k<10; k++)
{
fun1();
fun2();
}
return 0;
}
i和j的值分别是什么,为什么?
1.3.2,修饰函数
第二个作用:修饰函数。函数前加static使得函数成为静态函数。但此处“static”的含义
不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函
数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件
中的函数同名。
关键字static有着不寻常的历史。起初,在C中引入关键字static是为了表示退出一个
块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件
访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二
种含义。
当然,C++里对static赋予了第三个作用,这里先不讨论,有兴趣的可以找相关资料研
究。
1.4,基本数据类型----short、int、long、char、float、double
C语言包含的数据类型如下图所示:数值类型
基本类型
构造类型
指针类型
空类型void
整
型
短整型short
整型int
长整型long
单精度型float
数组
结构体struct
浮点型
双精度型double
字符类型char
共用体union
枚举类型enum
C
数
据
类
型
1.4.1,数据类型与“模子”
short、int、long、char、float、double这六个关键字代表C语言里的六种基本数据类型。
怎么去理解它们呢?举个例子:见过藕煤球的那个东西吧?(没见过?煤球总见过吧)。那个
东西叫藕煤器,拿着它在和好的煤堆里这么一咔,一个煤球出来了。半径12cm,12个孔。
不同型号的藕煤器咔出来的煤球大小不一样,孔数也不一样。这个藕煤器其实就是个模子。
现在我们联想一下,short、int、long、char、float、double这六个东东是不是很像不同
类型的藕煤器啊?拿着它们在内存上咔咔咔,不同大小的内存就分配好了,当然别忘了给
它们取个好听的名字。在32位的系统上short咔出来的内存大小是2个byte;int咔出来的
内存大小是4个byte;long咔出来的内存大小是4个byte;float咔出来的内存大小是4个byte;double咔出来的内存大小是8个byte;char咔出来的内存大小是1个byte。(注意这里指一
般情况,可能不同的平台还会有所不同,具体平台可以用sizeof关键字测试一下)
很简单吧?咔咔咔很爽吧?是很简单,也确实很爽,但问题就是你咔出来这么多内存块,
你总不能给他取名字叫做x1,x2,x3,x4,x5...或者长江1号,长江2号...吧。它们长得这么像(不
是你家的老大,老二,老三...),过一阵子你就会忘了到底哪个名字和哪个内存块匹配了(到
底谁嫁给谁了啊?^_^)。所以呢,给他们取一个好的名字绝对重要。下面我们就来研究研究
取什么样的名字好。