1. 下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b> 6)? puts("> 6") : puts("<= 6");
}
【参考答案】这个问题测试你是否懂得C 语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。
不管如何,这无符号整型问题的答案是输出是“>6” 。原因是当表达式中存在有符号类型和无符号类型时所有
的数都自动转换为无符号类型。因此-20 变成了一个非常大的正整数,所以该表达式计算出的结果大于6 。
这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了
得不到这份工作的边缘。
2. 评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1‘s complement of zero */
【参考答案】对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:
unsigned int compzero = ~0;
这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,
然而PC机程序往往把硬件作为一个无法避免的烦恼。
3. 下面的代码片段的输出是什么,为什么?
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Gota null pointer");
else
puts("Gota valid pointer");
【参考答案】提示:这个答案是不确定的,因为C语言并没有明确规定malloc(0)时的表现,由各malloc函数库的实现者来定义。
4. 实现 strcmp 函数。
【参考答案】
int mystrcmp(const char* str1, const char* str2)
{
while( *str1 != '\0' && *str2 != '\0')
{
if( *str1 ++ != *str2 ++)
break;
}
return ( *--str1 - *--str2);
}
5. 下面的程序将输出:
void digui(int a)
{
if(a >0)
{
digui(a/2);
}
printf("%d\n", a);
}
int main(void)
{
digui(10);
return 0;
}
【参考答案】 提示:递归函数如何退出,执行顺序。
打印:
0
1
2
5
10
6. 下面程序输出啥?
int main()
{
char a[1000];
int i ;
for(i = 0; i < 1000; i++){
a[i] = -i - 1;
}
printf("len: %d\n", strlen(a));
return 0;
}
【参考答案】
提示:strlen将判断字符串结束符'\0'之前的字符的长度,所以要找到字符串结束符。
char类型的取值范围为:-128 ~ 127,而一直加的话,值会反转的。比如说:a=127, a++, 则a的值将会反转到-128
这里数组a的值为: -1, ..., -128, 127, ..., 1, 0 = 128 + 127 = 255, 所以知道当数组元素等于0的时候,前面有255个数,
所以答案是:255.
7. 用宏定义求一个数的平方。
#define Square(x) ((x)*(x))
这里只是考察必须在最外层加上大括号。如果是定义成 (x)*(x) 就会有问题。
比如 100/Square(5) = 100/(5)*(5) 就完全不对了。
当然,这里如果Square(i++) 执行这样的自加自减,这样定义宏肯定是不行的。
8. 问题:
int *(*p)[4]; 表示啥意思?
int *(*p)[4];(*P)表示p是一个指针,然后与右边的[]结合,表示P是指向一个有四个元素的数组,
int *表示返回指向整形的指针,所以int *(*p)[4] 表示p指向一个有含有四个指向整形的指针元素的数组
这里替换成:X = *p, int *(*p)[4] = int *X[4],是不是非常容易理解了。
int (*(*p)[3])(int *) 这个表示啥意思?
优先级 () > [] > *,所以首先(*p)表示p为一个指针,然后执行(*p)[3]表示该指针指向一个3个元素的数组,
然后结合:*(*p)[3],表示定义一个指针指向前面指向一个3个元素的数组的指针,也就是指针的指针了。
然后在结合:int (*fun)(int *),表示该指针为一个函数指针,函数的类型为,有点乱了......
可以替换理解,更容易。假设 X = *p,所以 int (*(*p)[3])(int *) = int (*X[3])(int *),立马简单了。
int (*X[3])(int *): X为含有三个元素的数组,该元素为指向函数的指针,函数的类型为 int (*)(int *);
int (*(*p)[3])(int *): 非常简单了,p就是指向X的指针,也就是说p是一个指向含有3个元素的数组的指针,
而该数组的每个元素是指向函数的指针(该指针的类型为 int(*)(int *))。
*(void (*)())0() 表示啥意思?
先将0强制转化为一个函数指针,类型为 void (*)(),然后跳转到该地址0执行。
阅读(941) | 评论(0) | 转发(0) |