第一章 关键字
C语言共有32个关键字。
关键字 | |
auto | 声明自动变量 |
int | 声明整型变量 |
long | 声明长整型变量 |
char | 声明字符型变量 |
float | 声明浮点型变量 |
short | 声明短整型变量 |
double | 声明双精度变量 |
signed | 声明有符号类型变量 |
unsigned | 声明无符号类型变量 |
struct | 声明结构体变量 |
union | 声明联合数据类型 |
enum | 声明枚举数据类型 |
static | 声明静态变量 |
switch | 用于开关语句 |
case | 开关语句分支 |
default | 开关语句中的其他分支 |
break | 跳出当前循环 |
register | 声明寄存器变量 |
const | 声明只读变量 |
volatile | 说明变量在程序中可被隐含地改变 |
typedef | 给数据类型取别名 |
extern | 声明变量是在其他文件中声明(若要寻找声明定义的话,去其他文件中找) |
return | 子程序返回语句 |
void | 声明无返回值,无参数,无指针类型 |
continue | 结束当前循环,开始下一循环 |
do | 循环语句的循环体 |
while | 循环语句的循环条件 |
if | 条件语句 |
else | 条件语句否定分支 |
for | 循环语句 |
goto | 无条件跳转语句 |
sizeof | 计算对象所占内存大小 |
1.定义与声明的区别:
定义:编译器创建一个对象,为这个对象分配一块内存(有住的地方),并给它取上一个名字即变量名(怎么称呼),而且在一定区域内只能被定义一次。
声明:第一重含义,告诉编译器,这个变量已经被定义了(名字,内存地址都被分配好了)。
第二重含义,这个名字已经被预定了,别的地方不能用它来声明变量名或对象名。如
void fun(int i, char c);
2.关键字register
- register变量必须是能被CPU寄存器所接受的类型(必须是单个的值,其长度小于等于整形的长度)
- register变量可能不放在内存中,不能用取值运算符“&”来获取register变量的地址
3.关键字static
修饰变量:
静态全局变量:作用于仅限于变量被定义的文件中,其他文件即使使用extern声明也无法使用它。更准确的说,作用域从定义之处开始,到文件结尾处结束,在定义之前的 代码也不能使用它(最好在文件顶端处定义)
静态局部变量:函数运行结束,但static修饰的变量不会被销毁,下次仍可使用这个值
修饰函数:函数前加static为静态函数,指对函数的作用域仅限于本文件
4.基本数据类型——short,int,long,char,float,double
在32位系统上,char 内存大小为 1字节
short 内存大小为 2字节
int 内存大小为 4字节
long 内存大小为 4字节
float 内存大小为 4字节
double 内存大小为 8字节
5.变量的命名规则
【规则1-1】命名应当直观,可望文知义,便于记忆与阅读
【规则1-2】命名的长度应该符合“min-length && max-information”原则
【规则1-3】当标识符有多个词组成时,每个词的第一个字母大写
【规则1-4】避免名字中出现数字编号
【规则1-5】多个文件之间共同使用的全局变量或函数要加范围限定符
6.标识符的命名规则
【规则1-6】标识符分为两部分:规范标识符前缀 + 含义标识
【规则1-7】变量命名使用名词性词组,函数命名使用动词性词组
【规则1-8】程序中不能出现仅靠大小区分的标识符(尤其要注意 数字1和字母l;数字0和字母o)
【规则1-9】一个函数名禁止被用于其他之处(如命名一个变量)
【规则1-10】所有宏定义,枚举常数,只读变量全用大写字母命名,用下划线分割单词,如
const int MAX_LENGTH = 100; #define FILE_PATH "/usr.tmp"
【规则1-11】局部变量中可采用通用的命名方式。如n,m,i,j,k表示int类型;c,ch表示字符;a表示数组;p表示指针
【规则1-12】结构体被定义时必须有明确的结构体名
【规则1-13】定义变量的同时千万别忘了初始化
【规则1-14】不同类型的数据之间的运算要注意精度扩展问题
【规则1-15】禁止使用八进制格式的数
【注意】strlen()函数是计算字符串长度的,并不包含字符串最后的'\0'。如果遇到'\0',就认为本字符串结束。
【规则1-16】单纯的char类型应该只用于字符值的存储和使用;有符号的和无符号的“char”型变量只能用于数值的存储和使用。
【规则1-17】所有无符号型常量都应该带有字母U后缀。
7.if,else组合
- bool变量与“零值”进行比较。
if(bTestFlag)
if(!bTestFlag)
- float变量与“零值”进行比较。
if( (fTestVal >= -EPSION)&&(fTestVal <= EPSION)) //EPSION为定义好的精度
- 指针变量与“零值”进行比较。
if(NULL == p) if(NULL != p)
【规则1-18】先处理正常情况,再处理异常情况(如果把执行概率更大的代码放到后面,也就意味着if语句将进行多次无谓的比较)
【规则1-19】所有的 if-else 结构应该由else子句结束(对最后的else语句的要求是保护型编程。试想if-else结构没有列举出所有的情况,而程序此时必须有形影的操作)
【建议】把空语句写成 NULL;
if (NULL != p) ; fun();
8.switch,case组合
case后面只能是整型或字符型的常量或常量表达式。
【规则1-20】每个case语句后不要忘了加break;
【规则1-21】最后必须使用default分支
【规则1-22】switch case组合中禁止使用return语句(这点还没搞懂)
【规则1-23】按字母或数字顺序排列各条case语句
【规则1-24】把正常情况放到前面,异常情况放到后面(一般而言,异常情况出现的情况相对较少,故将其放在后面)
【规则1-25】按执行频率排列case语句
【规则1-26】将default语句只用于检查真正的默认情况
9.do,while,for关键字
【建议1-27】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在外层,减少CPU跨切循环层的次数
【建议1-28】for语句的循环控制变量的取值采用“半开半闭区间”
【建议1-29】不要在for循环体内修改循环变量,防止循环失控
【建议1-30】循环嵌套控制在3层以内
【规则1-31】for语句的控制表达式不能包含任何浮点类型的对象(舍入误差和截取误差会通过循环的迭代过程传播)
10.关键字 void
void *为空类型指针,可以指向任何类型的数据。
void真正发挥的作用在于:对函数返回的限定;对函数参数的限定。
任何类型的指针都可以直接赋值给 void *,无需进行强制转换,如
void *p1; int *p2; p1=p2;
【规则1-32】如果函数没有返回值,那么应将其声明为void类型
【规则1-33】如果函数无参数,那么应声明其参数为void
【规则1-34】如果函数的参数可以是任意类型指针,那么应声明其为 void *
11.关键字const
const修饰的是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容
const修饰的只读变量必须在定义的同时初始化。
const int *p; //p可变,p指向的对象不可变 int const *p; //p可变,p指向的对象不可变 int * const p; //p不可变,p指向的对象可变 const int * const p; //p不可变,p指向的对象不可变
先忽略类型名,const里那个近就修饰哪一个(离指针p近,p不可变;离*p近,对象不可变)。
修饰函数的参数,不希望这个参数值在函数体内被改变
void Fun(const int *p);
修饰函数的返回值,返回值不可改变。
const int Fun(void)
12.关键字 extern
extern可以置于变量或函数前,以表明变量或函数的定义在别的文件中,提示链接器遇到此变量或函数时在其他模块中解析/绑定次标识符。
13.关键字 struct
将一些相关联的数据打包成一个整体,方便使用。
【建议】要求函数的参数尽量不多于4个,这是可以用结构体压缩参数个数
14.关键字 union
一个union只配置一个足够大的空间来容纳最大长度的数据成员。
15.关键字 typedef
typedef struct student { //code }Stu_st,*Stu_pst;
如上,typedef就是给“struct student{/*code*/}”取了个别名叫“Stu_st”;
同时给“struct student{/*code*/} *”取了个别名叫“Stu_pst”
2013-08-26
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:《C语言深度解剖》学习笔记之关键字 - Python技术站