• 2.15 C++专项练习 错题复盘


    定义宏#define DECLARE(name, type) type name##_##type##_type,
    则DECLARE(val, int)替换结果为()

    正确答案: A   你的答案: B (错误)

    int val_int_type
    int val_int_int
    int name_int_int
    int name_int_name


    解析:##相当于强制分割,所以分成了 name,_,type,_type 所以答案显而易见了


    以下数字在表示为double(8字节的双精度浮点数)时存在舍入误差的有()。

    正确答案: A B C   你的答案: A B (错误)

    2的平方根
    10的30次方
    0.1
    0.5
    100

    解析:小数看是否有误差的时候就是化为二进制,如果能够化开那就可以,如果不行的话那么就要舍入




    下列运算符重载函数中,属于友元函数的是(      )

    正确答案: B C D   你的答案: C D (错误)

    Base operator+(Base);
    Base operator--(Base);
    Base operator&&(Base, Base);
    Base operator++(Base,int);


    解析:看出是否是友元的话主要是看是否能够调用this指针,这样就会少传进一个参数,




    下面关于"指针"的描述不正确的是()

    正确答案: A   你的答案: C (错误)

    当使用free释放掉一个指针内容后,指针变量的值被置为NULL
    32位系统下任何类型指针的长度都是4个字节
    指针的数据类型声明的是指针实际指向内容的数据类型
    野指针是指向未分配或者已经释放的内存地址

    解析:当free释放内存之后,指针还指向原来的那块地址,需要我们设置 p = NULL;如果不手动设置 p = NULL,此时P就变成了野指针



    C++中关于堆和栈的说法,哪个是错误的:

    正确答案: C   你的答案: D (错误)

    堆的大小仅受操作系统的限制,栈的大小一般一般较小
    在堆上频繁的调用new/delete容易产生内存碎片,栈没有这个问题
    堆和栈都可以静态分配
    堆和栈都可以动态分配
    解析:选C,静态分配是指在编译阶段就能确定大小,由编译器进行分配,堆不可以进行静态分配,堆的申请都是在执行过程中进行的。
    A,堆和栈的大小都可以设置,栈一般只有几KB。
    B,堆在动态分配时,要申请连续的内存空间,释放后会产生碎片。
    D,堆是使用malloc()、calloc()、realloc()等函数动态分配的,而使用alloca()函数可以动态分配栈的内存空间,释放的时候由编译器自己释放。



    以下关于内联函数,说法正确的是:

    正确答案: A B C   你的答案: A C (错误)

    一般用于加快程序执行速度
    可能减小可执行文件大小
    可能增加可执行文件大小
    以上说法都不正确
    解析:AC选项不说了,直接说B选项。若这个函数被调用了一次,那么内联直接被插入到函数调用出,就直接没有了这个函数符号了,若加上优化,这一句代码可能会被优化没有,所以,可执行文件可能会减少。



    Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 (  ).

    正确答案: C   你的答案: A (错误)

    11 ,-11
    11 ,-12
    12 ,-11
    12 ,-12
    解析:floor : 意为地板,指向下取整,返回不大于它的最大整数 ceil : 意为天花板,指向上取整,返回不小于它的最小整数 round : 意为大约,表示“四舍五入”,
    而四舍五入是往大数方向入。Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11而不是-12。


    下面的程序输出可能是
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Printer{
        public:
            Printer(std::string name) {std::cout << name;}
    };
    class Container{
        public:
            Container() : b("b"), a("a") {}
        Printer a;
        Printer b;
    };
    int main(){
        Container c;
        return 0;
    }

    正确答案: C   你的答案: A (错误)

    可能是 "ab" 或 "ba"。 依赖于具体的实现
    一直都是 "ba"
    一直都是 "ab"


    解析:只和结构体定义的时候变量顺序有关



    如下代码一共创建多少个进程(包含主进程):
    1
    2
    3
    4
    5
    int main(int argc, char* argv[]) {
    fork();
    fork() && fork() && fork();
    fork() || fork();
    }

    正确答案: D   你的答案: B (错误)

    15
    18
    21
    24


    解析:首先需要明白的是fork()生成1个子进程,fork()之后有两个进程处于执行状态。因此执行完第一个fork(),生成的进程数是1(main)+1(子进程)看第二行的fork() && fork() && fork(),
    执行完第一个fork(),父进程返回非0,子进程返回0,子进程后面的fork()均不会执行,此时产生了1个子进程,那么三个fork()就产生了3个子进程(注意,这是1个进程产生的),
    因此执行完第二行,产生了6个子进程,系统中一共有8个进程在执行,要是不明白的自己画个二叉树就清楚了。在看第三行,fork() || fork(),原理和第二行相同,只是只有子进程才能继续,
    父进程只能执行第一个fork(),执行这一行每个进程可以产生两个子进程,也就是一***生2 * 8 = 16个子进程所以答案就是 2 + 6 + 16 = 24



    请指出以下程序的错误:
     
    void GetMemory(char **p, int num)
    {
        if(NULL==p && num<=0)//1
     
            return;
        *p=(char*)malloc(num);
        return;
    }
    void main(void){
        char *str=NULL;
        GetMemory(&str,80); //2
        if(NULL!=str){
            strcpy(&str,"hello"); //3
            printf(str);
        }
        return true//4
    }
     

    正确答案: A C D   你的答案: C D (错误)

    1
    2
    3
    4


    解析: if(NULL==p && num<=0)//1  应该为 if(NULL==p || num<=0) strcpy(&str,"hello"); //3   应为 strcpy(str,"hello"); return true; //4   与void冲突







    下面这个程序执行后会有什么错误或者效果:
    #define MAX 255
    int main()
    {
         unsigned char A[MAX], i;
         for (i = 0; i <= MAX; i++)
             A[i] = i;
    }

    正确答案: A B   你的答案: A (错误)

    数组越界
    死循环
    栈溢出
    内存泄露



    解析:这个问题能将面试者的能力分为三类;
    一:没错。。。那么说明面试者的C语言基础能力不行;
    二:有个错,是哪个i<=MAX; 数组下标越界。。嗯,还行;
    三:死循环,C的基本功很强。。达到了该题的测试目的;

    分析了一下: 
    出现了两个问题; 
    一:下标越界可以说是个问题,但不是问题的本质; 当i=MAX;即i=MAX是,对数组来说,255是越界了,那如果我把数组下标改了是不是就对了呢?比如说如下:
    #include <stdio.h>
    #define MAX 255
    int main() { 
    unsigned char a[256],i;//这里改成256是不是就对了呢? 还是不对;
    for(i=0;i< =MAX;i++)
    a[i]=i;
    for(i=0;i< =MAX;i++) 
    printf("%d ",a[i]); 
    }   
    其实越界了编译还是能通过的,因为编译器不检查越界问题;

    问题二: 上例还是错的,原因在于unsigned char 这个数据类型,它占了 8位,表示范围是 0~255(00000000~11111111,八位); 当改成256后,虽说看似数组下标没越界,但是当i=255; i++ ;因为 i本身是unsigned char类型,占8位,所以此时i+1变成了100000000 9位,又因为i只能占8位,所以舍掉了最高位,此时的i值又变成00000000了,即就是0;然后就成了死循环了。。。
  • 相关阅读:
    Vitrualbox虚拟机网络设置
    挂接命令(mount) 【转】
    ubuntu Error mounting /dev/sda6 at /media/xxx...
    mysql命令[转]
    fopen参数
    fprintf&prinft&sprintf
    UNIX 网络编程知识,函数积累
    vim 括号自动补全
    CDbConnection failed to open the DB connection
    [Android_蓝牙]Android4.0蓝牙使能的详细解析
  • 原文地址:https://www.cnblogs.com/Lis-/p/12312818.html
Copyright © 2020-2023  润新知