嵌入式笔试刷题(第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=6
是unsigned int
,b=-20
是int
。a+b
中,b
被隐式转换成unsigned,因为unsigned + sign
,规则是提升到。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式笔试专栏 文章被收录于专栏
本专栏系统整理了嵌入式方向笔试中常见的知识点和高频考题,涵盖基础理论、常用算法、C语言陷阱、操作系统原理、驱动开发、常见外设通信协议(如 I2C/SPI/UART)、RTOS、Linux 内核、以及实用电路知识等内容。