第二章数据类型十个问题

来源:互联网 发布:vbscript和vb 编辑:程序博客网 时间:2024/06/05 08:57

1. 变量的值被覆盖后如何恢复

不能恢复,以最后一次赋值的值为准。

 

2. 宏定义与const常量定义之间有什么区别

   define是宏定义,程序在预处理阶段将用define定义的内容进行了替换,因此程序运行时,常量表中没有用define定义的常量,系统不为它分配内存;const定义的常量,在程序运行时在常量表中,系统为它分配内存。

define定义的常量,预处理时直接进行了替换,所以编译时不能进行数据类型检验;const定义的常量,在编译时进行严格的类型检验,可以避免出错。

define定义表达式时要注意“边缘效应”。

 

3 类型强制转换是否要占用内存空间

  C语言中,强制类型转换有两种含义:

     1.将一个数据,复制为另一个数据类型,并且使用新类型的数据,此时可以认为新类型的数据,在内存结构方面与原有数据没有任何关系,这是实实在在的发生了转换,并且执行这个转换相关的代码是编译器生成的,例如:

  char c=c

  int i = (int) c;

     2.将一个数据当作另外一个数据类型使用,让编译器认为这就是另外一个数据类型,此时数据没有发生任何转换,在计算机的角度没有任何事情发生,也不为这个转换生成任何代码,只是编译器认为这个语句合法了

 

4 指针定义时*’靠着类型还是变量

   两种情况对编译器来说一样,只是让阅读代码的人看起来方便,比如:

   int  *p,q;int*  p,q;   

   两种定义都是pint类型指针,qint类型,阅读代码的人可能会把第二种情况中的pq误认为int类型指针

 

5 声明和定义如何区分

     变量和对象不加extern永远是定义,类中的除外

     函数只有函数头是声明,有函数体是定义

     类永远只是声明,类成员函数的函数体是定义

 

6 Auto,register,extern,static使用有什么区别

   对于auto变量:是函数中的局部变量,动态地分配存储空间,数据存储在动态存储区中,在调用该函数时系统会给他们分配存储空间,在函数调用结束时就自动释放这些存储空间

   对于register变量:为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,只有局部自动变量和形式参数可以作为寄存器变量

  对于extern变量:外部变量是在函数的外部定义的,它的作用域从变量定义处开始,到本程序文件的结尾,如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终

  对于static变量:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放

 

7 枚举能做到事,#define能不能做到?如果能,那为什么还需要枚举

   #define可以编译任意类型的常量,而枚举只能是定义整型常量

   枚举可以一次定义大量常量,#define只能一次定义一个

   枚举可以集中管理数据,具相同属性的整型数据可使用枚举,枚举可实现取值的自增,也可指定每个枚举的值,编写代码更容易,相对来说能减少出错的机会,也便于代码的后期维护和修改,枚举在内存中不占空间

 

8 联合体变量如何赋值和使用

  对联合体变量的赋值,使用都只能是对变量的成员进行

  联合变量的成员表示为:联合变量名.成员名

  不允许只用联合变量名作赋值或其它操作,也不允许对联合变量作初始化赋值,赋值只能在程序中进行

  一个联合体变量,每次只能赋予一个成员值。一个联合体变量的值就是联合变量的某一个成员值

 

9 void表示的数据类型有两种相反的意思,如何区分

void数据类型对立面,即“无类型”,本身不是一种数据类型,使用如下:

1)如果函数没有返回值,那么应将其声明为void类型

2)如果函数无参数,那么声明函数参数为void

     void *通用类型指针,可以指向任何类型数据,例:void *pVoid;float *pFloat; pVoid=*pFloat;//正确。无需强制转型(任何类型的指针都可以直接赋值给void*[赋值给其它类型,需要强转])

 

10 valotileconst有什么区别

     如果一个变量不会被本程序改变,通常可能给它加上const,,但如果该变量可能被其它程序(或计算机操作过程中自己)改变而本程序又在检测这个变量的值,就需要给它加上volatile,于是变量i就同时有volatileconst,这个时候i就具有constvolatile的双重属性,i变量不可以在编译过程中被程序代码修改,同时编译器不得对i进行优化编辑

 

 

原创粉丝点击