今天零碎学习的小知识点

来源:互联网 发布:基于java博客 编辑:程序博客网 时间:2024/04/30 10:46

1.枚举变量的值如何计算?
在枚举中,某个枚举变量的值默认为前一个变量的值加1,如果第一个枚举变量没有赋值,则默认为0。
如:enum{a,b=5,c,d=4,e}
则实际上是a=0,b=5,c=6,d=4,e=5
从这个例子中可以看出枚举变量值是可以重复的。

2.字符数组与字符指针的区别
看下面一个例子:
const char str1[]=”abc”;
const char str2[]=”abc”;

const char* str3=”abc”;
const char* str4=”abc”;`

str1和str2两个字符数组都存储在栈空间上,它们的值是各存储区的首地址,两者不相同;而str3 和str4并非字符数组而是字符指针,并不分配存储区,其后就得“abc”以常量的形式存储于常量区,str3 和str4是指它们指向的地址的首地址,而它们仅是指向该区首地址的指针,所以相等。

3.C++里面是不是所有的动作都是main()函数引起的?
不是,对于c++程序而言,静态变量、全局变量、全局对象的分配早在main()函数之前已经完成。并不是所有的动作都是从main()函数引起的,只是编译器是由main()开始执行的,main()是一个约定的函数入口。在main()函数中的显示代码执行之前,会调用一个由编译器生成的_main()函数,而_main()函数会进行所有全局对象的构造和初始化工作。
当程序退出时,全局变量必须销毁,如果有全局对象则会调用给相应的全局对象的析构函数。

4.a是变量,执行(a++)+=a语句是否合法?
首先引入左值和右值的概念。
左值:可以被改变,存储数据值的那块内存的地址,也称为变量的地址
右值:存储在某内存地址中的数据,也称为变量的数据

左值可以作为右值,但右值不可以作为左值

本题不合法,a++不能当做左值使用,a++表示取a的地址,把它的值装入寄存器,然后对内存中a的值执行加一操作;++a可以当左值使用,表示取a的地址,对它的内容进行加一操作,然后把值放入寄存器中。
a++的运算结果并不是a这个变量的引用,而是一个临时变量,不允许作为左值使用,甚至编译器不允许对一个临时变量重新赋值,上面的表达式会引起编译错误。

5.如何进行float、bool、int、指针变量与”零值“的比较?
考察对0值的判断是衡量程序员基本功的重要标准,不同变量与零值判断,往往方法也不一样。
(1)int类型
与0进行数值上的比较

if(n==0)if(n!=0)

(2)float类型
无论是float还是double类型的变量,由于他们在内存中的存储机制与整型数不同,有舍入误差,所以在计算机中,大多数浮点数都是无法精确表达的,在判断浮点数相等时,推荐用范围来确定:

const float EPSINON=0.00001;if((x>=-EPSINON)&&(x<=EPSINON)

(3)bool类型
表明其为“逻辑”判断

if(flag)if(!flag)

(4)指针类型

if(p=NULL)if(p!=NULL)

6.new/delete和malloc/free的区别是什么?
new与malloc动态申请的内存都位于堆中,无法被操作系统自动回收,需要对应的delete与free来释放空间,但是delete或free仅仅是告诉操作系统,这一块内存被释放了,可用作其他用途。但是由于没有重新对这块内存进行写操作,所以内存中的变量数值并没有发生变化,出现野指针的情况。因此,释放内存后,应该将指针指向置为空(NULL)

具体而言,new/delete与malloc/free的区别主要表现在以下几个方面:

(1). new能够自动计算需要分配的内存空间,malloc则需要手工计算字节数

int* p1=new int[2];int* p2=malloc(2*sizeof(int));

(2).new 与delete直接带具体类型的指针,malloc与free返回void类型的指针

(3).new是类型安全,malloc不是

int* p=new float[2];  //编译时就会报错int* p=malloc(2*sizeof(float));//编译时编译器无法指出错误来

(4).new将调用构造函数,delete将调用析构函数,而malloc 和free不能够调用

(5).malloc/free需要包含库文件stdlib.h;new/delete则不需要库文件支持

既然new/delete(c++运算符)的功能完全覆盖了malloc/free(C/C++语言的标准库函数),为什么在C++中没有取消掉malloc/free呢?其实,由于C++程序经常调用C函数,而C程序只能用malloc/free管理动态内存,所以在C++中仍然保留了malloc/free。

1 0
原创粉丝点击