我记得我开始学习C语言的时候,那时候还在读高中,我们老师就把C语言的关键字,全部写在黑板上,老师说我们下面的两节课的内容就是(把它给记下来)
你还记得标准C有多少个关键字吗?
第一:关键字描述
C99 关键字为32个
如果你还有不认识的,还应该好好复习复习了。
关键字 意义
auto 声明自动变量,缺省时编译器一般默认为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 计算对象所占内存空间大小
注意:
细心的童鞋,会发现我上述用了很多 "声明" 两个字,我要说的是 声明和定义的区别,比搞混淆了
定义:就是编译器创建一个对象,分配一块内存空间,并给它去了个名字,这个名字和内存空间对应。
声明:就是告诉编译器,这个名字已经比配过一块内存空间了,用到的变量或者在其他的地方定义过。或者我先预定这个名字,其他地方不能再用它了。
第二:关键字强解
2.1 Auto 关键字
也需,你还没见过该关键字,其实他是隐身了的,但是你最常用。编译器在默认的缺省情况下,所有变量都是auto 的。
2.2 访问最快的关键字 Register
学嵌入式的都知道,CPU中寄存器访问速度是最快的,其次就是缓存---然后就是内存----然后就是其他外存,而该关键字,就是请求编译器尽可能的将变量存在CPU 内部寄存器中而不是通过内存寻址访问以提高效率。
2.3 static
该关键字的作用,在面试的时候经常问的。
当修饰变量:
静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern 声明也没法使用它
静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了
修饰函数:
函数前加static 使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。
2.4 最冤枉的关键字----sizeof
他不是函数,而是关键字。
char *p;
sizeof(p);---->4 (32为系统)
2.5signed、unsigned 关键字
有符号,无符号关键字,没什么好说的。
如果定义 char test; 取值范围 -128-127
unsgiend char test; 取值范围 0-255
2.6 bool值
面试题目这样出的:
bool 变量与“零值”进行比较的if 语句怎么写?
float 变量与“零值”进行比较
指针变量与“零值”进行比较
答案:
1 :if(bTestFlag); if(!bTestFlag);
原因:1 如果 if(bTestFlag == 0); if(bTestFlag == 1);
bTestFlag 是什么?整型变量?如果要不是这个名字遵照了前面的命名规范,肯怕很容易让人误会成整型变量。所以这种写法不好。
2 如果 if(bTestFlag == TRUE); if(bTestFlag == FLASE);
FLASE 的值大家都知道,在编译器里被定义为0;但TRUE 的值呢?都是1吗?很不幸,不都是1。Visual C++定义为1,而它的同胞兄弟Visual Basic 就把TRUE 定义为-1.那很显然,这种写法也不好。
2:if((fTestVal >= -EPSINON) && (fTestVal <= EPSINON)); //EPSINON 为定义好的精度。
如果:if(fTestVal == 0.0); if(fTestVal != 0.0);
float 和double 类型的数据都是有精度限制的,这样直接拿来与0.0 比,能正确吗?明显不能,看例子: 的值四舍五入精确到小数点后 10位为:3.1415926536,你拿它减去0.00000000001 然后再四舍五入得到的结果是多少?你能说前后两个值一样吗?EPSINON 为定义好的精度,如果一个数落在[0.0-EPSINON,0.0+EPSINON] 这个闭区间内,我们认为在某个精度内它的值与零值相等;否则不相等。扩展一下,把0.0 替换为你想比较的任何一个浮点数,那我们就可以比较任意两个浮点数的大小了,当然是在某个精度内。
3:if(NULL == p); if(NULL != p);
应该没有什么歧义吧
2.7 const 关键字(也是面试问的最多问题之一)
1 修饰的只读变量
const int Max=100;
2 节省空间,避免不必要的内存分配,同时提高效率
#define M 3 //宏常量
const int N=5; //此时并未将N 放入内存中
......
int i=N; //此时为N 分配内存,以后不再分配!
int I=M; //预编译期间进行宏替换,分配内存
int j=N; //没有内存分配
int J=M; //再进行宏替换,又一次分配内存!
3 修饰一般变量
int const i=2; 或const int i=2;
4 修饰数组
int const a[5]={1, 2, 3, 4, 5};或
const int a[5]={1, 2, 3, 4, 5};
5 修饰指针
const int *p; // p 可变,p 指向的对象不可变
int const *p; // p 可变,p 指向的对象不可变
int *const p; // p 不可变,p 指向的对象可变
const int *const p; //指针p 和p 指向的对象都不可变
注意:记忆方法
先忽略类型名(编译器解析的时候也是忽略类型名),我们看const 离哪个近。“近水楼台先得月”,离谁近就修饰谁。
2.8 最易变的关键字----volatile
volatile 是易变的、不稳定的意思。很多人根本就没见过这个关键字,不知道它的存在。也有很多程序员知道它的存在,但从来没用过它。我对它有种“杨家有女初长成,养在深闺人未识” 的感觉。
作用:(面试题目)
1) 并行设备的硬件寄存器(如:状态寄存器)
2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3) 多线程应用中被几个任务共享的变量
2.9 最会带帽子的关键字----extern
声明为外面变量
A.C
int TestA=22;
B.c
extern int TestA;
TestA=23;
.......
今天就到这里了,下节 说说结构体