《C/C++工程师综合练习卷》之小试牛刀

前言

步入华中,研究生深造马上也有小一年时间了,忽然赶脚时间飞逝呀。来年此时,定会为工作之事亚历山大。笨鸟必须先飞,而且机会总是留给有准备的人嘛,由此,作为一个IT领域菜鸟程序媛,from now,开启学霸模式,扬帆远航!

第一套练习之感受

刚刚注册了牛客网的账号,准备在此衡量一下水平,好好磨练一番。看到推荐练习《C/C++工程师综合练习卷》,oh,20道题,2个小时。由于木有经验,好一番紧张~

结果用了20分钟,点完了20道选择题,真的是太草率了,都没有返回检查一下,手一抖就交了卷!!!

成绩可想而知,只做对了一半的题目,真的是要哭了。。。返回头思考一下,感觉题目考察的都是基础的牢固程度,还是基础知识不扎实!

毕竟是第一次,不可以气馁,未来一年时间内,必须稳扎稳打,定期测验自己,一点一滴的积累与进步!

错题分析与总结

1. 补充下面函数代码:

如果两段内存重叠,用memcpy函数可能会导致行为未定义。 而memmove函数能够避免这种问题,下面是一种实现方式,请补充代码。

#include <iostream>
using namespace std;
void* memmove(void* str1,const void* str2,size_t n)
{
    char* pStr1= (char*) str1;
    const char* pStr2=(const char*)str2;
    if  ( ) {
        for(size_t i=0;i!=n;++i){
            *(pStr1++)=*(pStr2++);
        }
    }
    else{
        pStr1+=n-1;
        pStr2+=n-1;
        for(size_t i=0;i!=n;++i){
            *(pStr1--)=*(pStr2--);
        }
    }
    return ( );
}

A. pStr1 < Pstr2 str1

B. pStr1+n < pStr2 str2

C. pStr1+n < pStr2 || pStr2+n < pStr1 str2

D. pStr2+n < pStr1 str1

分析:这是一道内存拷贝相关习题,显然,str2为源地址,str1为目标地址,分为两种情况拷贝:

i. 如果pStr1 < pStr2时,从前向后拷贝

ii. 如果pStr1 > pStr2时,若同样从前向后拷贝,那么可能会导致pStr1的初始值填充内容会被pStr2后部分的内容覆盖,所以此时应该采用从最后一个元素依次向前拷贝的方式。

答案:A

总结:看到这个题目,根本没有深入思考,不知道想什么呢,选了错误答案C。

3. 下面有关C++中为什么用模板类的原因,描述错误的是?

A. 可用来创建动态增长和减小的数据结构

B. 它是类型无关的,因此具有很高的可复用性

C. 它运行时检查数据类型,保证了类型安全

D. 它是平台无关的,可移植性

分析:模板类在编译时检查数据类型,保证了类型安全。

答案:C

4. 在下面函数执行后,func(1)=?

int func(int a)
{
    int b;
    switch (a)
    {
        case 1: b = 30;
        case 2: b = 20;
        case 3: b = 16;
        default: b = 0;
    }
    return b;
}

A. 30

B. 20

C. 16

D. 0

分析:这一题考察C语言基础,switch与case结合,正确的表达方式为,case n:语句;break;而题目中缺少了break,则导致判断没有作用,程序会一直执行到最后一条,返回0。

答案:D

总结:这一题选了A,还在想怎么会有这么简单的题目,唉,跳进了坑里!只能怪自己,基础不牢靠,做题不仔细!

5. 在32位机器上用gcc编译下面代码,求sizeof(A) sizeof(B) 分别为多少?

class A
{
        int a;
        short b;
        int c;
        char d;
};
class B
{
        double a;
        short b;
        int c;
        char d;
};

A. 12 16

B. 12 12

C. 16 24

D. 16 20

分析:遵循下面三个条件(1)结构体的大小等于结构体内最大成员大小的整数倍;(2)结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如double型成员相对于结构体的首地址的地址偏移量应该是8的整数倍;(3)为了满足规则1和2,编译器会在结构体成员之后进行字节填充;

题目中,结构体A中a占4B,b占2B,但是由于C占4B,为了满足条件2,b多占用2B,为了满足条件1,d占用4B,所以最终占用16B;

结构体B,a占8B,b占2B,但是由于c占用4B,则b将多占用2B,则abc总占用8+4+4=16B,为了满足条件1,d占用8B,所以最终占用24B。

答案:C

总结:错选了A,确实了解,存储对齐以及字节填充这回事,但是掌握的不够详细,不够牢固!

7. 下面有关C++线程安全,说法错误的是?

A. 线程安全都是由全局变量及静态变量引起的。

B. 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全

C. C++标准库里面的string是保证线程安全的

D. POSIX线程标准要求C标准库中的大多数函数具备线程安全性

分析:关于线程安全问题的理解,参考 http://blog.csdn.net/ghevinn/article/details/37764791 的讲解,而对于C++标准库中的string,查了些许资料,也没有明确的说法,既然此处它是错误的,就说明不可以说string是线程安全的。

答案:C

总结:错选A,对线程安全问题不了解。

8.以下程序的输出是?

class Base {
    public:
    Base(int j): i(j)  {}
    virtual~Base() {}
    void func1() {
        i *= 10;
        func2();
    }
    int getValue() {
        return  i;
    }
    protected:
    virtual void func2() {
        i++;
    }
    protected:
    int i;
};
class Child: public Base {
    public:
    Child(int j): Base(j) {}
    void func1() {
        i *= 100;
        func2();
    }
    protected:
    void func2() {
        i += 2;
    }
};
int main() {
    Base * pb = new Child(1);
    pb->func1();
    cout << pb->getValue() << endl; delete pb; }

A.11

B. 101

C.12

D.102

分析:考察基类与派生类函数调用问题,要看是基类对象还是派生类对象,另外还要看基类哪些函数是虚拟的,会被派生类覆盖,题目中pb是派生类对象,调用Child构造函数->Base构造函数,初始化为1,当调用函数func1()时,调用的是基类的函数,func1()不是虚函数,所以pb->func1()执行的是基类的func1函数,i= 10,然后调用func2()函数;这里的func2是虚函数,要往下派生类寻找,找到后执行派生类中的func2(),此时,i = 12;最后执行pb->getValue(),结果为12。

答案:C

总结:错选A,对继承的知识含糊不清。

9.下面对静态数据成员的描述中,正确的是?

A. 静态数据成员可以在类内进行初始化

B. 静态数据成员不可以被类的对象调用

C. 静态数据成员不受private控制符的作用

D. 静态数据成员可以直接用类名调用

分析:该题目考察类内静态数据成员,它类外初始化,通常在定义时进行初始化,但是当类型为const static时的整形时可以在类体内进行初始化。它同普通数据成员一样受到控制符的作用,可以使用类名直接调用或者使用对象调用。

答案:D

总结:这个题目错的离谱,貌似是看错选项,反正就是马虎!错选了C,呜呜呜。。。。

14. C++类体系中不能被派生类继承的是?

A. 构造函数

B. 静态成员函数

C. 非静态成员函数

D. 赋值操作函数

分析:构造函数是不能被继承的,但是可以被调用,如果父类重新定义了构造函数,也就是没有了默认的构造函数,子类创建自己的构造函数的时候必须显式的调用父类的构造函数。而其余的三个在我们平常的使用中都可以被继承使用。

答案:A

总结:错选了D,错以为派生类调用基类的构造函数,可以说继承,纠正这个错误!

18. 在32位的小端机器上,如下代码输出是什么?

 char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08};
 short *pshort = (short *)array;
 int *pint = (int *)array;
 int64 *pint64 = (int64 *)array;
 printf("0x%x , 0x%x , 0x%x , 0x%x", *pshort , *(pshort+2) , *pint64 , *(pint+2));

A. 0x201 , 0x403 , 0x807060504030201 , 0x0

B. 0x201 , 0x605 , 0x807060504030201 , 0x0

C. 0x201 , 0x605 , 0x4030201 , 0x8070605

D. 0x102 , 0x506 , 0x102030405060708 , 0x0

分析:

小端机器的数据高位字节放在高地址,低位字节放在低地址。x86结构为小端模式。

pshort占用2个字节,在内存中的16进制为0x01 0x02,对应的16进制数为0x0201。

pshort + 2指向array数组的下标为4的元素,占用2个字节,在内存中的16进制为0x05 0x06,对应的16进制数为0x0605。

pint64的int64类型不确定,但根据名字可以看出占用8个字节,对应的16进制形式为0x807060504030201。

pint + 2占用4个字节,指向的array数组的下标为8的元素,8-11个元素没有指定数组的初始化值,默认为0,因此*(pint + 2)对应的16进制为0。

答案:B

总结:错选C,蒙的。。。

总结

第一次做笔试题目就错了这么一堆堆,虽然很受挫,但是也激起了奋起直追的勇气,加油!

时间: 2024-10-01 03:03:47

《C/C++工程师综合练习卷》之小试牛刀的相关文章

《C/C++工程师综合练习卷》

前言 前天拿这个<C/C++工程师综合练习卷>练习了一下,现将错题以及精题分析总结. 错题分析与总结 2 . 下面的程序可以从1-.n中随机等概率的输出m个不重复的数.这里我们假设n远大于m,填充空缺语句. knuth(int n, int m) { srand((unsigned int)time(0)); for (int i = 0; i < n; i++) { if ( ) { cout << i << endl; ( ); } } } A. rand()

2019年消防工程师综合必看考点:建筑分类、高度、层数

建筑高度是每年消防工程师考试中的一个重点,但是总是有很多考生在这上面丢分,其关键的原因是,对于很多建筑分类.高度.层数傻傻弄不清楚,概念不清楚,在计算过程中肯定会打乱仗,因此,今天,众智博睿教育为广大考生整理了2019年消防综合必看考点:建筑分类.高度.层数,希望能助你一臂之力. ??建筑分类 ??工业建筑:包括单层.多层及高层的厂房和仓库,其中,火灾危险性类别分为甲.乙.丙.丁.戊类. ??民用建筑:包括单层.多层及高层的住宅建筑和公共建筑,其中,高层民用建筑根据其建筑高度.使用功能和楼层的建

《C/C++专项练习》— (1)

前言 每每到了一周之计的Monday啊,精神总是不佳,写篇博客提提神儿吧~ 继上次完成<C/C++工程师综合练习卷>后,有事儿没事儿就想刷几道题,赶脚不错,巩固了不少基础知识呢,要坚持哦~ C/C++专项练习(1) 完成时间:2015-06-06 21:49 题目总量:10 做题时间:20m 正确率:8 C/C++专项有好多百道题目呢,是巩固编程语言基础的好去处. 专项练习考察的都是程序设计内的细节问题,其中很多C逻辑运算的题目.求代码段输出结果的题目.C++面向对象题目等等. 错题分析总结

短期项目求软件测试工程师

项目介绍:ERP系统财务模块测试,项目周期约30天:5年以上工作经验高级测试工程师综合报酬约40K:3-5年工作经验中级测试工程师综合报酬约30K:3年以下工作经验初级测试工程师综合报酬约20K.工作内容 1)负责产品各阶段的测试及验证工作:2)制定集成测试方案并能有效组织产品各项目测试: 3)参与测试用例及方案的设计及评审:完成相关产品的测试用例编写: 4)制定测试计划.方案并执行,在各测试阶段进行分析总结及报告: 5)分析产品的风险,合理评估产品的发版预期,对被测产品负责: 要求 1)取得国

linux后端诊断与调试技术

本文不是liunx命令使用教程,也不打算全方面阐明其用法,互联网公司项目很多,服务程序之间相互依赖调用很复杂,各种因素会影响线程服务正常运行,特别是基础服务组件更是如此,当出现各种问题时,如何诊断linux下哪个环节出现问题或状况.从linux系统层面看,通过各种操作命令和手段快速定位线上程序的症状和要害很有必要.比如说:当线上服务长时间正常运行,张三某天突然监控到自己的程序出问题了,自己负责某个程序不提供服务或服务处于挂死(进程还在,但无法接收外部响应)状态,查看应用程序日志没发现明显错误或可

Oracle DBA数据库高级工程师培训套餐(全部)系列60多套+七大阶段+上千案例

Oracle DBA数据库高级工程师培训套餐(系列60多套+七大阶段+上千案例) 描述 Oracle DBA数据库高级工程师培训课程是风哥独自研发的精品实战课程,本路线图主要是让大家快速就业.高薪就业.课程内容以实战为主(占98%),理论为辅(占2%).本课程知识全面系统实用,结合风哥十年Oracle经验,囊括企业用到的所有知识点,课程包含大量实战案例,涉及Oracle核心技术及底层研究,从零开始学习Oracle到高级,让你快速跨入DBA圈子,真正超载OCP/OCM认证. 学习目标 本Oracl

[转]UML八大误解

潘加宇 本文删节版发表于<程序员>2013年11期 UML(统一建模语言)是软件建模的表示法标准.我从2002年开始专门从事研究和推广UML的工作,在为软件组织提供UML相关需求和设计技能服务时,经常会发现软件开发人员对UML建模存在种种误解.本文归纳了最典型的八个误解加以剖析. 误解一:UML是开发团队用来和客户沟通的 UML模型是开发团队内部高效沟通的手段,但不是用来和涉众沟通的.拿音乐中的五线谱类比,五线谱是音乐专业人士交流的工具,作曲要懂.编曲要懂.乐手要懂.指挥要懂.歌手要懂(注意:

学习C语言之前你要知道的事

序: 为了不浪费大家的时间,大牛就别继续往下看了,因为此文通篇都是废话.但是如果你真的是一个纯正的菜鸟,如果你真的是一个刚摸电脑的新手,如果你真的刚学C语言甚至还不知道C语言是什么,那么就请抽5分钟时间看看吧,也许真的会有帮助的. 我非常清晰的记得我大学时的第一堂C语言课.那是我所有的大学课程中最爽一堂课,为什么爽?因为我热爱C语言?呵呵,那个时候我连C语言是个毛线都不知道,哪里来的热爱.我之所以爽,是因为终于有一门课,可以让我这个学渣可以和学霸平起平坐了,大家都不会,要挂科一起挂啊.从始至终,

360春招技术岗编程题

360公司 2018校招 技术综合G卷在线考试编程题| 30.0分3/3[本题为选答题]奇异 长度(Web)时间限制:C/C++语言 1000MS:其他语言 3000MS内存限制:C/C++语言 65536KB:其他语言 589824KB 题目描述:给你一个图,0节点连接这一个联通块a,1节点连接着一个联通块b,ab仅由01这条边相连.现在我们定义奇异路径为恰好经过0-1这条边一次的路径,其他边可以经过任意次,且路径不带方向,1-2-3与3-2-1认为是两条路径.重边也算多条路.在这个图中有无数