[牛客網]錯題整理(5)

錯題集

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次

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章