错题集
1.下面关于#import和#include描述正确的是()
A.#import和#include不可以混合使用
B.#import只用于引用Objective-C的文件,#include只用于C和C++文件
C.#import和#include的使用效果完全相同
D.#import是#include的替代指令,防止重复引用
答案:D
解析:
预编译指令
Objective-C:#import
C,C++:#include
#import由gcc编译器支持
在 Objective-C 中,#import 被当成 #include 指令的改良版本来使用。除此之外,#import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。
使用哪一个还是由你来决定。一般来说,在导入 Objective-C 头文件的时候使用 #import,包含 C 头文件时使用 #include。
#import比起#include的好处就是不会引起交叉编译
2.以下哪些继承自 Collection 接口()
A.List
B.Set
C.Map
D.Array
答案:A B
解析:
3.union Test
{
char a[4];
short b;
};
Test test;
test.a[0]=256;
test.a[1]=255;
test.a[2]=254;
test.a[3]=253;
printf("%d\n",test.b);
问题:在80X86架构下,输出什么值?
答案:-256
解析:char类型的取值范围是-128~127,unsigned char的取值范围是0~256
这里a[0]=256,出现了正溢出,将其转换到取值范围内就是0,即a[0]=0;
同理,a[1]=-1, a[2]=-2, a[3]=-3,在C语言标准里面,用补码表示有符号数,故其在计算机中的表示形式如下:
a[0]=0, 0000 0000
a[1]=-1, 1111 1111
a[2]=-2, 1111 1110
a[3]=-3, 1111 1101
short是2字节(a[0]和a[1]),由于80X86是小端模式,即数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,在本例中,a[0]中存放的是b的低位,a[1]中存放的是b的高位,即b的二进制表示是:1111 1111 0000 0000,表示-256,故选B。
4.x是一个行列数均为1000二维数组,下面代码效率执行最高的是()
A.for(int j=0;j<1000;j++) for(int i=0;i<1000;i++) x[i][j]+=x[j][i];
B.for(int i=0;i<1000;j++) for(int j=0;j<1000;j++) x[i][j]+=x[j][i];
C.for(int i=0;i<1000;j++) for(int j=0;j<1000;j++) x[j][i]+=x[j][i];
D.for(int i=0;i<1000;i++) for(int j=0;j<1000;j++) x[i][j]+=x[i][j];
答案:D
解析:主要是考察了CPU cache的预取操作,数组x[1000][1000]在内存中,是按行进行存储。D选项外部循环是按行进行,因此操作第i行时,会将第i行后面的部分数预取到cache中,操作速度最快。
ABC选项其中都有跳列的操作,不能发挥cache的预取操作功能。
5.#include<iostream>
using namespace std;
class MyClass
{
public:
MyClass(int i = 0)
{
cout << i;
}
MyClass(const MyClass &x)
{
cout << 2;
}
MyClass &operator=(const MyClass &x)
{
cout << 3;
return *this;
}
~MyClass()
{
cout << 4;
}
};
int main()
{
MyClass obj1(1), obj2(2);
MyClass obj3 = obj1;
return 0;
}
运行时的输出结果是()
答案:122444
解析:关键是区分 浅/深拷贝操作 和 赋值操作:
没有重载=之前:
A a ;
A b;
a = b;
这里是赋值操作。
A a;
A b = a;
这里是浅拷贝操作。
重载 = 之后:
A a ;
A b;
a = b;
这里是深拷贝操作(当然这道题直接返回了,通常我们重载赋值运算符进行深拷贝操作)。
A a;
A b = a;
这里还是浅拷贝操作。
所以 MyClass obj3 = obj1; 调用的是拷贝构造函数。
如果写成 MyClass obj3; obj3 = obj1; 输出的结果就是 1203444
6.下面两段代码中for循环分别执行了多少次?
1.
unsigned short i,j;
for(i=0, j=2; i!=j; i+=5, j+=7)
{}
2.
unsigned short i,j;
for(i=3,j=7;i!=j;i+=3,j+=7)
{}
答案:32767 16383
解析:答案分析:unsigned short能表示216个数,其范围为0~2^16-1,j在i前2个位置,i以5的速度增长,j以7的速度增长,当增长到unsigned short表示的最大值又会返回0(以一个圈的形式循环)开始重新走直到i、j相遇,所以就是7t - 5t + 2 = 2^16,所以为32767次
第二个类似 (7t + 7)-(5t - 3) = 216,所以为16383次