准备面试刷到的,链接里是原文和答案: (a-c-test-the-0x10-best-questions-for-would-be-embedded-programmers)
这里我先只给出问题,可以作为能力自测,然后再去原文看答案。
1. 使用#define,定义一个明示变量(原文为manifest constant,“简单的宏主要用来定义那些被Kernighan和Ritchie称为“明示常量”(manifest constant)的东西。”)来表示一年中有多少秒,不考虑闰年。
2. 写出标准的MIN宏。也就是说,这个宏接收两个变量参数且返回其中较小的一个。
3. 预处理指令#error的用途?
4. 无限循环经常出现在嵌入式系统中。在c中如何实现无限循环?
5. 使用一个变量a, 写出下面定义的表达式。
(a)一个整数
(b)一个指向整数的指针
(c)一个指针指向一个整数指针
(d)一个拥有十个整数的数组
(e)一个拥有十个整数指针的数组
(f)一个指针指向有十个整数的数组
(g)一个函数指针:该函数有一个整数参数且返回一个整数
(h)一个有十个函数指针的数组: 该函数有一个整数参数且返回一个整数
6. static关键字的用法(3种)
7. const关键字是什么意思?
下列表达式(不完整)是什么意思?
1 const int a; 2 3 int const a; 4 5 const int *a; 6 7 int * const a; 8 9 int const * a const;
8. 关键字volatile是什么意思?给出他的三种不同用法。
(a)一个参数可以同时被定义为const和volatile嘛?解释下为什么。
(b)一个指针能被定义成volatile吗?解释下为什么。
(c)下面的函数有什么问题?
1 int square(volatile int *ptr) { 2 3 return *ptr * *ptr; 4 5 }
9. 嵌入式系统总是会要求使用者对变量或者寄存器进行位操作。给定一个整数变量a, 给出两部分代码。第一个置位a的第三比特。第二个清除a的第三比特。两种情况下,其他比特不能被改变。
10. 嵌入式系统经常需要编程人员访问内存的特定位置。在一个项目中,要求设置一个位于内存地址0x67a9的整数变量的值设为0xaa55。编译器为纯ANSI编译器。写出代码完成这个任务。
11. 中断是嵌入式系统中非常重要的部分。所以很多编译器厂商提供了标准c的扩展来支持中断。通常,这个新的关键字为“__interrupt”。下面的代码使用“__interrupt”定义了一个中断服务程序。给出你的评论。
1 __interrupt double compute_area(double radius) { 2 3 double area = PI * radius * radius; 4 5 printf("nArea = %f", area); 6 7 return area; 8 9 }
12. 下面程序的输出是什么?为什么?
1 void foo(void) { 2 3 unsigned int a = 6; 4 5 int b = -20; 6 7 (a + b > 6) ? puts("> 6") : puts("<= 6"); 8 9 }
13.对于下面的代码你有什么评论?
1 unsigned int zero = 0; 2 3 unsigned int compzero = 0xffff; /*1's complement of zero */
14. 即使不是很常见,但是有些嵌入式系统会从堆(heap)动态申请内存。在嵌入式系统中动态申请内存有什么问题?
下面的代码会输出什么?为什么?
1 char *ptr; 2 3 if ((ptr = (char *)malloc(0)) == NULL) { 4 puts(“Got a null pointer”); 5 6 } 7 8 else { 9 puts(“Got a valid pointer”); 10 11 }
15.
1 #define dPS struct s * 2 3 typedef struct s * tPS;
哪一种方法你更偏爱?为什么?
16. 下面的代码合法吗?如果合法代码执行了什么?
1 int a = 5, b = 7, c; 2 3 c = a+++b;