嵌入式笔试刷题专栏(第四天)
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 = 12
a = 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);