一. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

1
2
#define a_year (365*24*60*60)UL
//UL无符号整形

二. 写一个”标准”宏MIN ,这个宏输入两个参数并返回较小的一个

1
#define	MIN( a, b)	((a<=b)?(a):(b))

三. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

1
2
3
4
5
6
while(1)
{}
for(;;)
{}
loop:...
goto loop;

四. 用变量a给出下面的定义

  • a) 一个整型数(An integer)
  • b)一个指向整型数的指针( A pointer to an integer)
  • c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)
  • d)一个有10个整型数的数组( An array of 10 integers)
  • e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)
  • f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)
  • g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
  • h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 ( An array of ten pointers to functions that take an integer argument and return an integer )
1
2
3
4
5
6
7
8
int a;
int *p;
int **p;
int sum[10];
int *sum[10];
int (*sum)[10];
int *prie(int a)
int (*prie[10](int))

五. 关键字static的作用是什么?

首先,是static修饰了变量,延长了变量生命周期,直到程序运行结束后才释放。

之后是static修饰一个函数则这个函数只能在本文件中调用,不能被其他文件调用,Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0;

static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。

六. 关键字const有什么含意?

要一个变量前用const来修饰,就意味着该变量里的数据只能被访问,而不能被修改,也就是意味着const“只读”(readonly)。

七. 关键字volatile有什么含意?并给出三个不同的例子

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

  • 并行设备的硬件寄存器(如:状态寄存器)
  • 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
  • 多线程应用中被几个任务共享的变量

八. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

1
2
3
4
5
6
7
8
9
int main(void)
{
int a;

a |= (a << 3);
a &= ~( a << 3);

return 0;
}

九. 下面的代码输出是什么,为什么?

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

不管如何,这无符号整型问题的答案是输出是 “>6”。原因 是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。

因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。