局部(自动)变量声明符 auto(一般可以省略)
①自动变量是局部变量
②只能在局部范围使用
③未进行初始化前,自动变量的值不定④对统一函数两次调用,自动变量的值不保留,即用完即释放
寄存器变量声明符 register (通常把使用频率较高的变量(如循环次数较多的循环变量)定义为register类型)
静态变量声明符 static
①初始化时在编译时进行,定义是只能用常量或常量表达式进行显式初始化。在未显式初始化时:0(对整形);0.0(对实型);空串(对字符型)
②一个变量被指定为静态,在编译时即分配存储空间,程序整个运行阶段不释放
△③静态局部变量具有*可继承性* ,当变量在函数内被指定为静态时,该函数运行结束后,静态局部变量仍保留该次运行结果,下次运行时,该变量在上次运行的结果基础上继续工作。(与局部(自动)变量最大的区别)△④静态局部变量的值只能在*本函数(或复合语句或本文件)*中使用
定义静态局部变量只是为了在多次调用同意函数是使变量能保持上次调用结束时的结果。其它函数不能引用它的 值。生存期是一个时间概念,作用域是一个空间概念。
全局变量声明符 extern
外部变量(是全局变量)编译时分配在静态存储区,他可以为程序中哥哥函数所引用。
①限定只能在本文件使用的外部变量(静态外部变量 static);生存期为整个程序运行周期。好处是不必考虑是否与其他文件变量重名,以保证文件的独立性。
②可将普通外部变量的作用域扩充发到其他文件,允许其他文件中的函数引用。这时需要在这些外部变量的文件中对变量用extern 作声明。例:extern int a,它声明了本
文件中出现的变量a是一个已经在其他文件中定义的外部变量,本文件不必再问他分配内存,可以引用 a。
编译预处理主要有三种功能:宏定义、文件包含、条件编译
宏定义 #define 标示符 字符串
①为了与一般变量相区别,作为宏名的标示符一般用大写字母表示(也可以用小写)
②宏定义用宏名代替一个字符串,制作简单的替换,不做语法的检查,由于所有的预处理命令都在编译时处理完毕,它不具有任何计算,操作等执行功能。例:#define X 3+2 程序中有“y = X*X”,宏展开时,原式变为“y = 3+2*3+2;”而不是“y = 5*5 ”
③宏定义不是C语句,不能再行末加分号。如果加了分号则会连分号一起置换,在宏展开是产生语法错误
④如果宏名出现在字符串中,不会进行宏展开例:#define STR "Hello" printf("STR"); 上述语句不会打印Hello,而是打印STR
⑤如果字符串一行内装不下,可以放到下一行,只要在上一行的结尾处放一个反斜杠(\)即可
⑥在进行宏定义是,可以用已定义的宏名,即可以层次置换。(从最下面的宏定义语言向上逐层代换,不要认为的增加括号,也不要增加计算功能,宏展开只是字符串的替换)
⑦#define命令卸载文件开头,函数之前,作为文件的一部分,在此文件范围内有效。可以用#undef命令种植宏定义的作用域。带参数的宏定义 #define S(a,h) 5*a*h
文件包含:#include“文件名” OR #inlcude<文件名>
条件编译:
①#ifdef <标示符>
程序段1
#else
程序段2
#endif
功能:当指定标示符已经被定义过(一般用#define命令定义),则对程序段1进行编译,否则对程序段2进行编译。其中#else部分可以没有。②#ifndef <标示符>
程序段1
#else
程序段2
#endif
功能:若指定的标示符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的功能相反。
③#if 表达式
程序段1
#else
程序段2
#endif
功能:当指定的表达式为真(非零)时编译程序段1,否则编译程序段2。应用这种条件编译的方法,可以实现给定某一条件:使程序在不同的条件下执行不同的功能。