第一章 关键字

  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