錯題集
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次