笔试题目收集(3)

2023-11-19

笔试题目搜集系列推荐:

(1)笔试题目搜集1

(2)笔试题目收集2

(3)笔试题目搜集3

(4)笔试题目搜集4

(5)笔试题目搜集5





1.下列程序输出结果

typedef union {long i; int k[5]; char c;} DATE;  
struct data {   
    char cat;   
    DATE cow;   
    char dog;  
};  
cout<<sizeof(data)<<endl;

date按照4来对界,所以data结构体中按照最大的类型4来对界。最后结果28


2.运行下图中的C++代码,打印出的结果是什么? 

bool Fun1(char* str)  
{  
    printf("%s\n", str);  
    return false;  
}  
   
bool Fun2(char* str)  
{  
    printf("%s\n", str);  
    return true;  
}  
   
int _tmain(int argc, _TCHAR* argv[])  
{  
    bool res1, res2;  
    res1 = (Fun1("a") && Fun2("b")) || (Fun1("c") || Fun2("d"));  
    res2 = (Fun1("a") && Fun2("b")) && (Fun1("c") || Fun2("d"));  
   
    return res1 || res2;  
}

答案:打印出4行,分别是a、c、d、a。


3.编译运行下图中的C++代码,结果是什么?(A)编译错误;(B)编译成功,运行时程序崩溃;(C)编译运行正常,输出10。请选择正确答案并分析原因。(题目出自海涛:http://zhedahht.blog.163.com/blog/static/2541117420111169592105/

#include <iostream>  
   
class A  
{  
private:  
        int value;  
public:  
        A(int n)  
        {  
                value = n;  
        }  
        A(A other)  
        {  
                value = other.value;  
        }  
        void Print()  
        {  
                std::cout << value << std::endl;  
        }  
};  
   
int _tmain(int argc, _TCHAR* argv[])  
{  
        A a = 10;  
        A b = a;  
        b.Print();   
        return 0;  
}  
答案 :编译错误。在复制构造函数中传入的参数是 A 的一 个实例。由于是传值,把形参拷贝到实参会调用复制构造函数。因此如果允许复制构造函数传值,那么会形成永无休止的递归并造成栈溢出。因此 C++ 的标准不允许复制构造函数传值参数,而必须是传引用或者常量引用。在 Visual Studio GCC 中,都将编译出 错。

4.运行下图中代码,输出的结果是什么?这段代码有什么问题

#include <iostream>  
   
class A  
{  
public:  
        A()  
        {  
                std::cout << "A is created." << std::endl;  
        }  
   
        ~A()  
        {  
                std::cout << "A is deleted." << std::endl;  
        }  
};  
   
class B : public A  
{  
public:  
        B()  
        {  
                std::cout << "B is created." << std::endl;  
        }  
   
        ~B()  
        {  
                std::cout << "B is deleted." << std::endl;  
        }  
};  
   
int _tmain(int argc, _TCHAR* argv[])  
{  
        A* pA = new B();  
        delete pA;  
   
        return 0;  
}  

答案:输出三行,分别是:A is created. B is created. A is deleted。用new创建B时,回调用B的构造函数。在调用B的构造函数的时候,会先调用A的构造函数。因此先输出A is created. B is created.

接下来运行delete语句时,会调用析构函数。由于pA被声明成类型A的指针,同时基类A的析构函数没有标上virtual,因此只有A的析构函数被调用到,而不会调用B的析构函数。

由于pA实际上是指向一个B的实例的指针,但在析构的时候只调用了基类A的析构函数,却没有调用B的析构函数。这就是一个问题。如果在类型B中创建了一些资源,比如文件句柄、内存等,在这种情况下都得不到释放,从而导致资源泄漏。


5.运行如下的C++代码,输出是什么?(转自:http://zhedahht.blog.163.com/blog/static/254111742011299219769/

class A
{
public:
    virtual void Fun(int number = 10)
    {
        std::cout << "A::Fun with number " << number;
    }
};
 
class B: public A
{
public:
    virtual void Fun(int number = 20)
    {
        std::cout << "B::Fun with number " << number;
    }
};
 
int main()
{
    B b;
    A &a = b;
    a.Fun();
}

答案输出B::Fun with number 10。由于a是一个指向B实例的引用,因此在运行的时候会调用B::Fun但缺省参数是在编译期决定的。在编译的时候,编译器只知道a是一个类型a的引用,具体指向什么类型在编译期是不能确定的,因此会按照A::Fun的声明把缺省参数number设为10

这一题的关键在于理解确定缺省参数的值是在编译的时候,但确定引用、指针的虚函数调用哪个类型的函数是在运行的时候


6.运行下图中C代码,输出的结果是什么(转自:http://zhedahht.blog.163.com/blog/static/254111742011299219769/

int _tmain(int argc, _TCHAR* argv[])
{
    char str1[] = "hello world";
    char str2[] = "hello world";
 
    char* str3 = "hello world";
    char* str4 = "hello world";
 
    if(str1 == str2)
        printf("str1 and str2 are same.\n");
    else
        printf("str1 and str2 are not same.\n");
 
    if(str3 == str4)
        printf("str3 and str4 are same.\n");
    else
        printf("str3 and str4 are not same.\n");
 
    return 0;
}

答案输出两行。第一行是str1 and str2 are not same,第二行是str3 and str4 are same

str1str2是两个字符串数组。我们会为它们分配两个长度为12个字节的空间,并把"hello world"的内容分别拷贝到数组中去。这是两个初始地址不同的数组,因此比较str1str2的值,会不相同str3str4是两个指针,我们无需为它们分配内存以存储字符串的内容,而只需要把它们指向"hello world“在内存中的地址就可以了。由于"hello world”是常量字符串,它在内存中只有一个拷贝,因此str3str4指向的是同一个地址。因此比较str3str4的值,会是相同的

7.运行下面的代码,输出是什么?(之前始终不知道为什么是1,哈哈,何老师给了我答案)(转自:http://zhedahht.blog.163.com/blog/static/254111742011012111557832/

class A
{
};
 
class B
{
public:
        B() {}
        ~B() {}
};
 
class C
{
public:
        C() {}
        virtual ~C() {}
};
 
int _tmain(int argc, _TCHAR* argv[])
{
        printf("%d, %d, %d\n", sizeof(A), sizeof(B), sizeof(C));
        return 0;
}


分析:答案是1, 1, 4class A是一个空类型,它的实例不包含任何信息,本来求sizeof应该是0。但当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。Visual Studio 2008中每个空类型的实例占用一个byte的空间。

class Bclass A的基础上添加了构造函数和析构函数。由于构造函数和析构函数的调用与类型的实例无关(调用它们只需要知道函数地址即可),在它的实例中不需要增加任何信息。所以sizeof(B)sizeof(A)一样,在Visual Studio 2008中都是1

class Cclass B的基础上把析构函数标注为虚拟函数。C++的编译器一旦发现一个类型中有虚拟函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。在32位的机器上,一个指针占4个字节的空间,因此sizeof(C)4

8.运行下面中的代码,得到的结果是什么?(转自:http://zhedahht.blog.163.com/blog/static/254111742011299219769/

class A
{
private:
   int m_value;
 
public:
   A(int value)
   {
       m_value = value;
   }
   void Print1()
   {
      printf("hello world");
   }
   void Print2()
   {
      printf("%d", m_value);
   }
        
   virtual void Print3()
   {
      printf("hello world");
   }

};
 
int _tmain(int argc, _TCHAR* argv[])
{
    A* pA = NULL;
    pA->Print1();
    pA->Print2();
    pA->Print3();
    return 0;
}

答案:Print1调用正常,打印出hello world;但运行至Print2时,程序崩溃;运行Print3时,程序也会崩溃

分析:调用Print1时,并不需要pA的地址,因为Print1的函数地址是固定的。编译器会给Print1传入一个this指针,该指针为NULL,但在Print1中该this指针并没有用到。只要程序运行时没有访问不该访问的内存就不会出错,因此运行正常。在运行print2时,需要this指针才能得到m_value的值。由于此时this指针为NULL,因此程序崩溃了。

   由于Print3是虚函数。C++调用虚函数的时候,要根据实例(即this指针指向的实例)中虚函数表指针得到虚函数表,再从虚函数表中找到函数的地址。由于这一步需要访问实例的地址(即this指针),而此时this指针为空指针,因此导致内存访问出错。



9.运行如下的C代码,输出是什么?(转自:http://zhedahht.blog.163.com/blog/static/254111742011299219769/

char* GetString1()
{
    char p[] = "Hello World";
    return p;
}
char* GetString2()
{
    char *p = "Hello World";
    return p;
}
int _tmain(int argc, _TCHAR* argv[])
{
    printf("GetString1 returns: %s. \n", GetString1());
    printf("GetString2 returns: %s. \n", GetString2());
 
    return 0;
}

答案输出两行,第一行GetString1 returns: 后面跟的是一串随机的内容,而第二行GetString2 returns: Hello World. 两个函数的区别在于GetString1中是一个数组,而GetString2中是一个指针

    当运行到GetString1时,p是一个数组,会开辟一块内存,并拷贝"Hello World"初始化该数组。接着返回数组的首地址并退出该函数。由于pGetString1内的一个局部变量,当运行到这个函数外面的时候,这个数组的内存会被释放掉。因此在_tmain函数里再去访问这个数组的内容时,结果是随机的(栈空间分配的,所以函数调用结束后释放掉)

当运行到GetString2时,p是一个指针,它指向的是字符串常量区的一个常量字符串。该常量字符串是一个全局的,并不会因为退出函数GetString2而被释放掉。因此在_tmain中仍然根据GetString2返回的地址得到字符串"Hello World"

10.下面程序运行的结果(非常经典)

#include"iostream"  
using namespace std;  

class A{  
public:  
    A() {  
	func(0);  
    };  
    virtual void func(int data) {printf("A1 :%d\n",data);}  
    virtual void func(int data) const {printf("A2 :%d\n",data);}  
    void func(char *str) {printf("A3 %s\n",str);}  
};  

class B:public A{  
public:  
    void func() {printf("B1 :%s\n","");}  
    void func(int data) {printf("B2 :%d\n",data);}  
    void func(char *str) {printf("B3 %s)\n",str);}  
};  

int main()  
{  
    A *pA;  //没有new对象,不调用构造函数
    B b;  //调用构造函数
    const A *pcA;  
    pA=&b;  
    pA->func(1);  
    pA->func("test");  
    A().func(1);  
    pcA=&b;  
    pcA->func(2);  
    system("pause");
    return 0;  
} 
运行结果:





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

笔试题目收集(3) 的相关文章

  • 支付宝短视频平台创作分成激励项目

    没想到支付宝也开通了中视频计划 这波羊毛算是蒿定了 最近啊 马爸爸火速上线了支付宝创作分成计划 明显就是抄的抖音中视频计划 目前还在内测阶段 补贴的力度非常大 错过的话就只能拍大腿了 看到短视频这么的火爆 巨头大佬们都想分一杯羹啊 阿里也不
  • Linux下MySQL启动、停止、重启的几种方式

    一 启动 1 使用service 启动 service mysqld start 2 使用 mysqld 脚本启动 etc inint d mysqld start 3 使用 safe mysqld 启动 safe mysqld 二 停止
  • 互联网产品上线流程,及面试题分类

    一 基础情况 问题1 自我介绍 3mins 与自我介绍 1min 问题2 为什么你要来这个行业 问题3 为什么你要来这个岗位 问题4 为什么你能胜任这份工作 问题5 为什么你要离职 问题6 过往经历STAR故事描述 问题7 你的职业规划是什
  • php mes代码,完整MES代码(含客户端和server端)

    实例简介 完整的代码 带数据库文件 包含客户端 服务端 实例截图 核心代码 MES 源代码 MES 源代码 MES 源代码 dll AjaxControlToolkit dll AspNetServer dll AxInterop CELL

随机推荐

  • el-form 校验单个字段

    单个校验 核心为 validateField 而非validate
  • 关于编译器生成默认构造函数的理解

    构造函数 构造函数是创建类类型对象时 由编译器自动调用 用来初始化对象的函数 它保证每个数据成员都有一个合适的初始值 并且在对象的生命周期内只调用一次 函数名与类名相同 无返回值 构造函数可以重载 什么是默认构造函数 无参的构造函数 全缺省
  • JAVA中的while do-while循环以及for循环的深刻理解 入门 小白必看

    循环 循环 循环 循环的作用 提出问题为什么需要循环 解决问题循环的出现 while 前序 循环 while循环的语法与流程以及细节 do while 后序循环 do while循环的语法和流程 while和do while 之间的区别 f
  • 人工智能顶会顶刊以及SCI,IF,核心,分区

    人工智能顶会顶刊以及SCI IF 核心 分区 标签 常识 刚上研究生的时候 老师总会让大家看论文 并且还要求要看好文章 要看顶会或者顶刊上面的文章 但是刚开始就不知道什么是顶会或者顶刊 所以这里整理了一下在人工智能方面的顶刊或者顶会 比如c
  • HacksudoAliens

    HacksudoAliens arp scan interface eth0 192 168 1 0 24 nmap sC sV p sT 192 168 1 251 sS sT sA sW sM TCP SYN Connect ACK W
  • Java自动生成bean、dao、service、impl、controller(JPA初版)

    关自动生成代码我是这么想的 初步 目录 一 拿到所有表名 列名 列类型数据 C3P0连接数据库并获取所需数据 所需数据对象 测试拿到的数据 结果 二 用FreeMarker模板生成对应JPA架构Java文件 编写模板 bean ftl be
  • C语言实验——打印金字塔

    Problem Description 输入n值 打印下列形状的金字塔 其中n代表金字塔的层数 Input 输入只有一个正整数n Output 打印金字塔图形 其中每个数字之间有一个空格 Sample Input 3 Sample Outp
  • 美创科技发布“韧性”数据安全防护体系框架

    4月13日 美创科技数据安全产品架构升级发布会顺利举办 会上 美创重磅发布 韧性 数据安全防护体系框架 全新数据安全框架 以 资产 为中心 由内而外 以 看见 基石 旨在通过构建 弹性和韧性 可见性 适应性进化 的数据安全防护能力 帮助用户
  • Python打印输出数组中全部元素的方法

    学习Python的人都知道数组是最常用的的数据类型 为了保证程序的正确性 需要调试程序 因此 需要在程序中控制台中打印数组的全部元素 如果数组的容量较小 例如 只含有10个元素 采用print命令或print函数可以答应出数组中的每个元素
  • 记一次挖矿病毒应急处置全过程&挖矿处置基本操作

    记一次挖矿病毒应急处置全过程 挖矿处置基本操作 一 处置过程 1 查看第一位的pid号 32535 2 进入 tmp X11 unix 目录 其中 11 文件中写的是32535 01 文件中写的是守护进程pid号10092 目录里的文件不一
  • 【Vue】Vue基础自用笔记&Day03_①Vue生命周期②Vue网络请求③Vue动画

    Vue基础 Day03 1 Vue生命周期 this nextTick 方法 2 Vue网络请求 vue resource Axios 3 Vue动画 使用CSS创建动画 或者使用第三方动画库 animate css 使用JS创建动画 使用
  • var 的变量提升

    var 的变量提升 var 定义的变量的定义时存在变量提升现象 console log a undefined var a 10 console log a 10 原理 js 引擎在渲染代码时 将变量声明部分和函数声明部分提升到函数的顶部
  • An error occurred in the current transaction. You can‘t execute queries until the end of the ‘atomic

    问题 如图所示 错误返回结果是An error occurred in the current transaction You can t execute queries until the end of the atomic block
  • PythonML-Day02: k-近邻、朴素贝叶斯、决策树、随机森林、交叉验证、网格搜索

    ML Day02 k 近邻 朴素贝叶斯 决策树 随机森林 交叉验证 网格搜索 1 数据分类 离散型数据 可以列举出 连续型数据 在区间内可任意划分 不可一一列举 2 机器学习算法分类 监督学习 预测 有特征值和目标值 有标准答案 分类 离散
  • BeanUtils.copyProperties的使用(浅拷贝)

    BeanUtils copyProperties的使用场景 将一个 Java 对象的属性值复制到另一个对象中 解决方法通常有2种方法 一个一个set 用BeanUtils copyProperties 很显然BeanUtils更加方便 代码
  • python中permute_PyTorch中permute的用法详解

    permute dims 将tensor的维度换位 参数 参数是一系列的整数 代表原来张量的维度 比如三维就有0 1 2这些dimension 例 import torch import numpy as np a np array 1 2
  • js-ajax

    一 ajax Asynchronous Javasript And Xml 通过Ajax向服务器请求数据 在不刷新整个页面的情况下 更新页面的内容 二 Ajax的创建 三步走 1 创建XMLHttpRequest对象 用来和服务器进行数据交
  • hdu1827Summer Holiday【tarjan强连通分量解决最小联系费用】

    1A 撒花 这比买买买开心多了 思路 既然是强连通分量的题 很容易想到形成的东西是一坨一坨的 哈哈 然后如果某一坨入度为0 那么很不幸 这一坨只能直接被威士忌通知 至于具体通知这一坨中的哪一个 枚举一遍就知道了 最后把话费求和 感觉强连通分
  • python程序运行提示Process finished with exit code -1073741819 (0xC0000005),程序终止运行...

    这个错误代码是表示程序运行时发生了访问冲突 通常是由于程序尝试访问不属于它的内存空间导致的 这可能是由于程序代码本身存在 bug 也可能是因为计算机环境问题造成的 为了解决这个问题 需要调查程序的代码 找出导致访问冲突的原因 然后修改代码以
  • 笔试题目收集(3)

    笔试题目搜集系列推荐 1 笔试题目搜集1 2 笔试题目收集2 3 笔试题目搜集3 4 笔试题目搜集4 5 笔试题目搜集5 1 下列程序输出结果 typedef union long i int k 5 char c DATE struct