嵌入式笔试刷题(第36天)

11. const 有什么用途?(请至少说明两种)

✅ 答案:

  • 修饰变量:变量只读,防止修改。
  • 修饰函数参数:保护传入参数,防止在函数内意外更改。
  • 修饰返回值:保证返回值不被修改。
  • 修饰成员函数:表示成员函数不会修改对象内容。

✅ 讲解:

常见用法示例:

const int a = 10; // 变量只读

void func(const int* p); // 指针指向的数据不能改

class A {
public:
    int getValue() const; // 成员函数不会修改成员变量
};

12. 在C++程序中调用被C编译器编译后的函数,为什么要加 extern "C" 声明?

✅ 答案:

  • 因为 C++ 支持函数名重载,C语言不支持
  • extern "C" 禁止C++编译器对函数名进行改名(Name Mangling)
  • 保证C++程序能正确链接C编译的函数。

✅ 讲解:

C++编译器会把函数名带上参数信息做"花名"处理,比如 int foo(int) 编译成 _Z3fooi

加了 extern "C",编译器就按C的规则保留原名:

extern "C" void foo();

这样C++能直接找到C语言的符号,完成链接。

13. 给定int a,写两行代码,设置第三位和清除第三位,保持其他位不变。

✅ 答案:

a |= (1 << 3); // 设置第3位为1
a &= ~(1 << 3); // 清除第3位为0

✅ 讲解:

  • (1 << 3):把1左移3位,得到掩码0x08
  • |=:位或,设置某位为1。
  • &= ~:位与取反,清除某位为0。

第三位指的是从0开始数的第3位(也就是数值8的位置)。

14. 不调用库函数的情况下实现一个 strcpy 函数。

✅ 答案:

char* my_strcpy(char* dest, const char* src)
{
    char* ret = dest;
    while ((*dest++ = *src++)); // 包括拷贝\0
    return ret;
}

✅ 讲解:

跟之前第4题一样,这里再强调:

  • while ((*dest++ = *src++)); 把赋值和判断合成一行,非常高效。
  • 拷贝结束标志是拷贝了字符串结束符\0

15. What will be printed as the result of the operation below, why?

void foo(void)
{
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts("> 6") : puts("< 6");
}

✅ 答案:

> 6

✅ 讲解:

  • a=6unsigned intb=-20int
  • a+b中,b隐式转换成unsigned,因为unsigned + sign,规则是提升到。

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

嵌入式笔试专栏 文章被收录于专栏

本专栏系统整理了嵌入式方向笔试中常见的知识点和高频考题,涵盖基础理论、常用算法、C语言陷阱、操作系统原理、驱动开发、常见外设通信协议(如 I2C/SPI/UART)、RTOS、Linux 内核、以及实用电路知识等内容。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务