main auto int k;/错误外部变量声明不 能使用auto存储类型* auto int a i main( if(a>=1){ auto int b auto int a a=1 if(a>=1){ auto int b float fun( auto int c, float d) auto double e; 26
26 main ( ) { auto int a ; a = 1 ; if ( a >= 1) { auto int b ; …… } …… } float fun ( auto int c , float d) { auto double e ; …… } auto int k ; /* 错误,外部变量声明 不 能使用auto存储类型*/ main ( ) { auto int a ; a = 1 ; if ( a >= 1) { auto int b ; …… } …… }
声明了存储类型为 register型的变量称之为“寄存器型 变量”。对于这种存储类型: a)用来要求把声明的变量存储到计算机的寄存器中去。 b)这种变量存取速度快 c)只能用于局部变量及函数的形式参数变量定义。 register 型变量与auo型变量具有相同的性质。 d)若声明的这种变量的个数超过机器可供使用的寄存器数, C编译系统会自动地将超过的部分作为auto型变量处理, 存放到堆栈区中。 e)因寄存器长度有限不能将 long double型的浮点数定义 成 register型变量。 f)不允许对 register型变量进行取地址“&”操作。 27
27 声明了存储类型为register型的变量 称之为 “寄存器型 变量”。对于这种存储类型: a) 用来要求把声明的变量存储到计算机的寄存器中去。 b) 这种变量存取速度快。 c) 只能用于局部变量及函数的形式参数变量定义。register 型变量与auto型变量具有相同的性质。 d) 若声明的这种变量的个数超过机器可供使用的寄存器数, C编译系统会自动地将超过的部分作为 auto型变量处理, 存放到堆栈区中。 e) 因寄存器长度有限,不能将 long double 型的浮点数定义 成 register型变量。 f) 不允许对register型变量进行取地址“&”操作
例 #include <stdio.h> main( register int a /*可简写为 register a;* scanf(“%d”,&a);/这里取a的地址运算是错误的* 注意:当 register关键字用于int局部变量声明时,其后的 in关键字可以缺省不写。 28
28 例: #include <stdio.h> main ( ) { register int a ; /*可简写为register a ; */ scanf ( “%d”, &a ) ; /*这里取a的地址运算是错误的*/ …… } 注意: 当register关键字用于int 局部变量声明时,其后的 int关键字可以缺省不写
声明了存储类型为 static型的变量,称之为“静态型变 对于这种存储类型: a)C编译程序总是将这种变量存储到到静态数据区; b)这种变量在整个程序的执行期间一直有效; c)(语言允许定义静态局部变量和静态全局变量
29 声明了存储类型为 static 型的变量 , 称之为 “静态型变 量”。 c) C语言允许定义静态局部变量和静态全局变量。 b) 这种变量在整个程序的执行期间一直有效; a) C编译程序总是将这种变量存储到到静态数据区; 对于这种存储类型:
静态局部变量 静态局部变量的局部特性与auto一样,与auto的区别 在于: (1)存储的内存区域不同,auto变量存储在堆栈区, static 型局部变量存储在静态数据区 (2) static型局部变量不随函数或复合语句的进入/退出而 建立消亡。形象地说 static型局部变量有“继承性 即本次进入函数或复合语句使用的stac型局部变量的 值是上一次该函数或复合语句执行结束退出时的该函 数或复合语句的值
30 静态局部变量 静态局部变量的局部特性与 auto 一样, 与auto的区别 在于: (1) 存储的内存区域不同 ,auto变量存储在堆栈区, static 型 局部变量存储在静态数据区; (2) static 型局部变量不随函数或复合语句的进入/退出而 建立/消亡。形象地说 static 型局部变量 有 “继承性” , 即本次进入函数或复合语句使用的static型局部变量的 值是上一次该函数或复合语句执行结束退出时的该函 数或复合 语句的值