[牛客网]错题整理(5)

时间:2024-04-11 18:57:02

错题集

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

解析:

 [牛客网]错题整理(5)

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次