4.11 疑难解惑
疑问1:变量的定义与声明有什么区别?
答:简单而言,声明一般书写在main()函数之前,使用关键字“extern”,并且在声明的时候不需要建立存储空间;而定义一般书写在main()函数体中,在定义的同时就建立了存储空间。例如:
#include<stdio.h> extern int p; // 使用关键字“extern”,在main函数之前声明变量 int main() { int p; // 书写在main函数体中,可称为定义变量 …… }
实际上在main函数体中的“int p”可称为变量定义也可称为变量的声明,但是如果在main函数之前并使用“extern”关键字那一定是变量的声明。
疑问2:C语言中不同类型的数据能否进行混合运算?
答:可以,强制转换就行,int('A')就将char型转换成int型,还有就是可以利用一些函数进行转换,如itoa()将int型转换成char型等。
疑问3:typedef与#define有什么区别?
答:#define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查。而typedef是在编译时处理的,它在自己的作用域内给一个已经存在的类型一个别名,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内。
疑问4:自动类型转换与强制类型转换的区别是什么?
答:自动类型转换与强制类型转换之间的区别就在于当进行长度“缩短”的转换时必须使用显式转换,比如“float a=2.5;int b=a;”这样的转换就会出现问题,原因是int可自动上升为float,但是float却不能自动转换为int,而必须使用强制类型转换“int b=(float) a”。
疑问5:赋值与初始化有什么不同?
答:初始化是在定义某个变量的时候就给变量赋值的操作(从无到有),而赋值操作是对于已经存在的某个变量,再重新给此变量赋值的操作。
例如:
int i=1; // 定义变量i的同时给变量i分配数值,从无到有的过程,也就是初始化 i=2; // 对已存在的变量i分配数值,也就是赋值操作
疑问6:静态局部变量与静态外部变量二者有什么区别?
答:虽然静态局部变量与静态外部变量都是静态的存储方式,但是二者具有以下区别:
(1)二者在定义的时候,所处的位置是不同的。静态内部变量是在函数的函数体内进行定义;静态外部变量在函数外进行定义。
(2)二者的作用范围不同。静态内部变量的作用域仅限于定义它的函数体内部,虽然它的生存期为整个源程序,但是其他函数不能够对它进行访问与使用;由于静态外部变量是在函数外进行定义的,所以它的作用域为定义它的源文件内部,生存期为整个源程序,但是其他源文件中的函数是不能对它进行访问的。
(3)二者初始化处理方面有所不同。静态局部变量是在第一次调用它所在的函数时进行初始化,再次调用定义它的函数时,不再进行初始化,而是保留上次调用结束时的值;而静态外部变量由于是在函数外进行定义,所以不存在重复调用初始化的问题,它的值由距离它最近的一次赋值操作来决定。