L=(int *)malloc((N+1)*4);
t=0;
for(i=1;i<=N;i++) L[i]=rand(); ti[t++]=clock(); BubbleSort(L,N); ti[t++]=clock();
for(i=1;i<=N;i++) L[i]=rand(); ti[t++]=clock(); SelectSort(L,N); ti[t++]=clock();
for(i=1;i<=N;i++) L[i]=rand(); ti[t++]=clock(); InsertSort(L,N); ti[t++]=clock();
for(i=1;i<=N;i++) L[i]=rand(); ti[t++]=clock(); ShellSort(L,N); ti[t++]=clock();
printf(\ for(k=0;k<4;k++)
printf(\
N*=5; }
printf(\}
6.一个类中,const类型成员函数的主要作用是什么?在该函数中可以调用该类的什么类型的成员变量和成员函数?该类的一个非const对象可以调用const成员函数吗?(10)
(1)可以定义const常量,具有不可变性。
(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。例如: void f(const int i) 编译器就会知道i是一个常量,不允许修改;
(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!如(1)中,如果想修改Max的内容,只需要:const int Max=you want;即可! (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错; 例如: void f(const int i)
(5) 为函数重载提供了一个参考。 class A { ......
void f(int i) //一个函数
void f(int i) const //上一个函数的重载 ...... };
(6) 可以节省空间,避免不必要的内存分配。
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。 (7) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
不能修改类的数据成员,不能在函数中调用其他不是const的函数. 1)const对象调用的是const成员函数 。
2)非const成员函数可以调用const成员函数,这样做一般是用来避免代码重复,但引入了一个casting动作。
7.下面两个语句的执行效果相同吗?为什么?(9)
语句1: while(*p++){}; 语句2: while(*p){ p++;} 区别在于退出循环后, p的值不一样
while( *p++ ); //当*p=0时,退出循环,此时p++仍然执行了 while( *p ) p++; //当*p=0时,退出循环,此时p++不再被执行
例如 char *p=\ 执行完第一个while循环后,p指向的是'\\0'后面的一个字节,*p的结果是未知的
而如果是执行第二个循环,则p指向的是'\\0',也就是'D'后面的一字节,即*p='\\0