嵌入式笔试刷题专栏(第四天)
11. 写一个“标准”宏 MIN(A, B),并说明表达式 least = MIN(*p++, b) 返回什么值?
✅ 答案:
#define MIN(A, B) ((A) < (B) ? (A) : (B))
- 使用宏时需要注意参数的副作用。
least = MIN(*p++, b)会出现宏展开:
least = ((*p++) < (b) ? (*p++) : (b));
这会导致 p++ 执行两次,不是你想要的行为,可能造成 未定义行为 或 逻辑错误。
✅ 正确做法:使用内联函数或避免带副作用的表达式作为参数。
12. 使用变量 a 给出以下定义:
① | 一个整型数 |
|
② | 一个指向整型数的指针 |
|
③ | 一个指向指针的指针,它指向的指针是指向一个整型数 |
|
④ | 一个有10个整型数的数组 |
|
⑤ | 一个有10个指针的数组,该指针是指向一个整型数的 |
|
⑥ | 一个指向有10个整型数数组的指针 |
|
⑦ | 一个指向函数的指针,该函数有一个整型参数并返回一个整型数 |
|
⑧ | 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 |
|
13. 简要叙述关键字 static 和 const 的含义与作用。
✅ 答案:
static函数内部变量:保持其值,生命周期延长到程序结束。文件内部函数/变量:限制作用域,仅在当前文件中可见(避免命名冲突)。const用于定义只读变量,防止被修改。例如:const int a = 5; 表示变量 a 不可再被赋值。
14. 全局变量与局部变量的区别?
作用域 | 文件内或整个程序 | 函数或语句块内部 |
生命周期 | 程序运行期间一直存在 | 函数运行时创建,用完释放 |
存储位置 | 数据段(.data/.bss) | 栈区(stack) |
初始值 | 默认值为 0 | 不初始化为随机值 |
15. 在不使用第三方变量的情况下交换两个变量的值(3种方法)
✅ 方法一:加法法
a = a + b; b = a - b; a = a - b;
✅ 方法二:异或法
a = a ^ b; b = a ^ b; a = a ^ b;
✅ 方法三:乘除法(适用于非 0 值)
a = a * b; b = a / b; a = a / b;
16. 写出至少 20 个常用 Linux 命令,含用法与例子
| 列出文件 |
| 列出详细信息 |
| 改变目录 |
| 进入 /etc 目录 |
| 显示当前路径 |
| |
| 创建目录 |
| 创建 test 文件夹 |
| 删除文件或目录 |
| 强制删除 test |
| 拷贝文件 |
| 复制 a 为 b |
| 移动或改名 |
| 改名为 c.txt |
| 创建空文件 |
| |
| 显示文件内容 |
| |
| 文本搜索 |
| 搜索 main |
| 查找文件 |
| |
| 显示进程 |
| 所有进程 |
| 杀死进程 |
| |
| 修改权限 |
| |
| 修改属主 |
| |
| 查看磁盘空间 |
| |
| 查看目录大小 |
| |
| 实时监控进程 |
| |
| 查看网络信息 |
| |
| 网络测试 |
|
17. 下面的代码输出什么?为什么?
void foo(void) {
unsigned int a = 6;
int b = -20;
(a + b > 6) ? puts("> 6") : puts("<= 6");
}
✅ 答案:
输出结果为:
> 6
解释:
a = 6 (无符号),b = -20 (有符号)a + b:int被提升为unsigned int,-20转换为无符号整数的大数值- 所以结果非常大,自然大于 6
18. 比较以下两种方式,哪种更好?并举例说明
#define dPS struct s * typedef struct s * tPS;
✅ 答案:
推荐使用 typedef:
#define是文本替换,容易出错,不能调试typedef是类型定义,可读性更好,有类型检查- 例如:
tPS p1, p2; // 都是 struct s *
而:
#define dPS struct s * dPS p1, p2; // 实际是 struct s *p1, p2; ⇒ p2 是 struct s,不是指针!
19. 求下列代码中 a, b, c 的值:
int a = 5, b = 7, c; c = a+++b;
✅ 答案:
解析:a+++b 被解析为 a++ + b,即先 a++ 再 + b
c = 5 + 7 = 12a = 6,b = 7,c = 12
20. 下列代码打印的值是多少?
#include<stdio.h>
int main() {
unsigned long long b = 1;
int a = 100;
printf("%d,%d", b, a);
return 0;
}
✅ 答案:
输出:未定义行为
%d用于打印int,但b是unsigned long long,类型不匹配- 正确写法:
printf("%llu, %d", b, a);
