嵌入式软件-C语言笔试题
最近有个深圳的朋友跟我分享他到某著名汽车零部件供应商的面试经历,其中一个老外面试官问他擅长的编程语言是什么?他自觉自己在大学期间C语言学习的还不错,就回答是C语言,然后就开启了他颇为难堪的现场笔试过程。下面是朋友根据回忆给我分享的题目,有兴趣的同志,可以看看自己能否答对。C语言,入门容易精通难。
第一题:32位机器,下面程序输出的结果是_____.
void func(int a[100])
{
printf("%d\n",sizeof(a));
}
int main(void)
{
int a[100];
func(a);
return 0;
}
乍一看感觉此题结构简单,并无复杂的逻辑,以为是送分题,实则暗藏杀机。答案是4,不是100。
第二题:下面程序输出的结果是_____.
int main(void)
{
int i;
char c[500];
for(i=0;i<500 ; i++)
{
c[i]= -1-i;
}
printf("%d\n",strlen(c));
return 0;
}
看过《C语言深度解析的》的朋友对这道题应该不会陌生,是一道经典题目,如果不知道数在计算机中的存储形式,很难答对此题。该题答案是255,解析过程如下:
计算机中数值采用补码的编码形式,基于补码进行运算;
char a[500]默认情况是signed数据类型,因此最高位为符号位;
strlen判断字符串结束标志为'\0' , 对应c[i] 等于0。
寻找答案的过程就是寻找c[500]中第一个为0的元素。
i |
-1-i |
[-1-i] 补 |
c[i] |
0 |
-1 |
0xff |
-1 |
1 |
-2 |
0xfe |
-2 |
... |
... | ... | ... |
127 |
-128 |
0x10 |
-128 |
128 |
-129 |
[-1]补 = 1111 1111 +[-128]补 = 1000 0000 -------------------------- 1 0111 1111 |
127 高位溢出丢弃 |
129 |
-130 |
[-2]补 = 1111 1110 +[-128]补 = 1000 0000 -------------------------- 1 0111 1110 |
126 |
... |
... | ... | .. |
255 |
-256 |
[-128]补 = 1000 0000 +[-128]补 = 1000 0000 -------------------------- 1 0000 0000 |
0 |