蔚来 - 嵌入式软件 - 笔试

❗❗如果本文对您有帮助,请不要吝啬您的评论、点赞、收藏与小花,这对我非常重要!谢谢!❗❗

alt

本文所涉及的题目均为基于个人学习和理解重新表述的内容,仅供学习交流之用,不代表任何实际考试题目。如有雷同,纯属巧合。

岗位:校招-嵌入式软件工程师

题型:20 道单选题 ,10 道不定项选择题 ,3 道编程题

1、单选题

1.1

下面程序的运行结果为 ==(D)==

#include<stdio.h>  
  
int main()  
{  
    int sum=0,count=0;  
    do  
    {  
        count++;  
        if(count%2 == 0)  
            continue;  
        sum += count;  
    }while(count<10);  
  
    printf("%d\n",sum);  
    return 0;  
}
  1. A. 45
  2. B. 30
  3. C. 55
  4. D. 25

解答:

1 + 3 + 5 + 7 + 9 = 25

1.2

下面程序的运行结果为 ==(A)==

#include <stdio.h>  
#include <string.h>  
  
struct STU  
{  
    char name[20];  
    int age;  
};  
  
int main()  
{  
    struct STU A, B;  
    A.age = 20;  
    strcpy(A.name, "张三");  
    B.age = 19;  
    strcpy(B.name, "小红\08");  
    A = B;  
    printf("%s %d", A.name, A.age);  
    return 0;  
}
  1. A. 小红 19
  2. B. 小红\08 19
  3. C. 语法错误,非法的赋值
  4. D. 张三 20

解答:

A=B 意味着 A.name = "小红\08", A.age = 19
通过 %s 输出 "小红\08" ,遇到 \0 结束符停止,则只会输出 "小红"

1.3

下图是 UML 中的什么图 ==(D)==

Click To View Image

  1. A. 活动图
  2. B. 时序图
  3. C. 类图
  4. D. 用例图

1.4

现有如下 C++ 代码片段,请问 auto 将会被推导为什么类型 ==(B)==

int y = 9;
auto* p1= &y;
  1. A. int* 类型
  2. B. int 类型
  3. C. auto* 类型
  4. D. auto 类型

解答:

y 为 int 类型
&y 表示取 y 的地址
p1 应该为 int* 类型
auto 被自动推导为 int 类型

1.5

关于面向对象编程以下说法正确的是 ==(B)==

  1. A. 面向对象编程是无状态的
  2. B. 多态是指不同事物具有不同表现形式的能力
  3. C. 数据封装、继承和唯一性是面向对象的三大特点
  4. D. 面向对象编程不属于命令式编程

解答:

面向对象有状态
封装、继承和多态是 OOP 的三大特点
面向对象属于命令式编程

1.6

下列关于 STL 容器说法正确的是 ==(A)==

  1. A. std:vector 可以动态扩容
  2. B. std:queue 可以通过下标访问任意其中一个元素
  3. C. std:array 可以动态扩容
  4. D. std:queue 是双向队列
  5. E. std:set 重载了 [] 运算符

解答:

向量可以动态扩容
队列不可以通过下标访问任意其中一个元素,而数组可以
数组不可以动态扩容,一旦定义好,长度就固定了
queue 是队列,deque 是双向队列
set 重载了某些运算符(<>==),但没有重载 +-[] 运算符

1.7

在 C++ 中,以下程序输出正确的 ==(B)==

#include <iostream>

class Base {
public:
    Base() { std::cout << "P"; }
    ~Base() { std::cout << "p"; }
};

class Sub : public Base {
public:
    Sub() { std::cout << "S"; }
    ~Sub() { std::cout << "s"; }
private:
    Base b;
};

int main() {
    Sub s;
    return 0;
}

  1. A. SPPpps
  2. B. PPSspp
  3. C. SPPspp
  4. D. PPSpps

解答:

执行 Sub s; 后按顺序发生如下事件

  1. 调用基类构造函数,输出 P
  2. 创建成员变量 b,由于其是基类,因此再次调用基类构造函数,输出 P
  3. 调用派生类构造函数,输出 S

执行 return 0; 程序退出后按顺序发生如下事件

  1. 调用派生类析构函数,输出 s
  2. 析构成员变量 b,由于其是基类,因此调用基类析构函数,输出 p
  3. 调用基类析构函数,输出 p

最终输出结果为 PPSspp

1.8

如下面所示的程序,定义了联合体变量,则该联合体所占用的内存空间为多少字节 ==(D)==

#include <stdio.h>  
  
union MyUnion  
{  
    char c;  
    short n;  
    int m;  
}u[3];  
  
int main() {  
   printf("%d\n", sizeof(u));  
    return 0;  
}
  1. A. 21
  2. B. 18
  3. C. 24
  4. D. 12

解答:

联合体最大成员变量 m 占 4 字节,最大成员变量类型 int 占 4 字节
因此联合体占 4 字节
由于定义了包含三个该联合体的数组,因此 sizeof(u) 应该等于 12

1.9

C++ 中一个重要的思想就是面向对象,而类就是实现面向对象的媒介,以下哪种情况,C++ 里面的类需要添加一个虚析构函数?==(C)==

  1. A. 该类仅需要继承其他类
  2. B. 该类仅是模板类
  3. C. 该类仅设计被继承
  4. D. 该类仅是匿名空间里的类
  5. E. 该类仅需要运算符重载

解答:

模板类、匿名空间和运算符重载与虚析构函数无关
当该类仅设计被继承时,意味着该类为基类,需要添加一个虚析构函数来保证派生类对象被正确释放

1.10

在 C++ 中,类的定义如下,对 Sub 进行 sizeof 计算,得到的结果 ==(C)==

class Base  
{  
public:  
    int a;  
    char b;  
};  
  
class Sub : public Base  
{  
public:  
    char c;  
};
  1. A. 10
  2. B. 8
  3. C. 12
  4. D. 6

解答:

与结构体计算占内存字节大小类似
基类中变量 a 对齐数为 4 ,b 对齐数为 1 ,最大对齐数为 4 ,因此基类内存为 8 字节 派生类中变量 c 对齐数为 1 ,最大对齐数继承基类的为 4 ,因此派生类内存为 4 字节 sizeof(派生类) = 8 + 4 = 12

1.11

以下 C++ 代码运行,会发生什么?==(D)==

#include<iostream>  
using namespace std;  
void fun(char* &p)  
{  
    p = (char *)malloc(sizeof(char)*10);  
}  
int main()  
{  
    for(int i = 0;i < 1000000000; i++)  
    {  
        char *p = NULL;  
        fun(p);  
        free(p);  
    }  
    return 0;  
}
  1. A. 内存泄漏
  2. B. 野指针异常
  3. C. 栈溢出
  4. D. 编译正确,运行正常,运行时间长也不会产生问题
  5. E. 编译正确,运行直接报错

解答:

不断的从堆中申请 10 字节内存,然后释放,重复 1000000000 次
不会造成内存泄漏,也没有野指针出现,栈更不会溢出,编译也没有问题
可以正常运行,但是运行时间会很长

1.12

下面关于设计模式相关的说法错误的是 ==(C)==

  1. A. 行为型模式关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装
  2. B. 设计模式主要包括三大类:创建型模式、结构型模式、行为型模式
  3. C. 结构型模式提供了一种在创建对象的同时隐藏创建逻辑的方式
  4. D. 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结

1.13

分析以下 C++ 代码可能存在什么问题?==(B)==

#include<iostream>  
using namespace std;  
class Test {  
private:  
    int m_value;  
public:  
    Test(int n){  
        m_value = n;  
    }  
    Test(Test &other){  
        m_value = other.m_value;  
    }  
    void Print() {  
        std::cout << m_value << std::endl;  
    }  
};  
  
int main()  
{  
    Test a = 1;  
    Test b = a;  
    b.Print();  
    return 0;  
}
  1. A. 编译运行正常,输出 10
  2. B. 编译错误,

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。

全部评论

相关推荐

评论
2
14
分享

创作者周榜

更多
牛客网
牛客企业服务