考题整理--搜狗笔试题

    今天上午早起,跟学院的几个哥们一起去北大,参加搜狗的笔试题目,没有收到短信和邮件,只能霸笔,但是整个考试下来,还是发现不少有价值的收获,随手抄了几道考题出来,顺便在机器上运行了一下,看看结果,跟自己当时想的有何出入,也算是一种查漏补缺,让自己不断的积累吧。

1.写出下列程序的运行结果:

#include <iostream>

using namespace std;

int main()

{
short input[10]={'A','B','C','D','E'};
unsigned char *p=(unsigned char*)&input;
int s=0;
int temp=sizeof(input);
for(int i=0; i<temp; ++i)
{
char v=p[i];
if(v>0)
s+=v-'A'+i;
}
printf("%d\n",s);
}

答案 :A:10    B:15    C:25   D:30   E:35   F:得到不确定的结果或程序崩溃

分析: 这道题目出的很不错,当时考试的时候我最先得到的答案是20,可是没有选项,最后只能选F,刚才运行了一下结果,发现最主要的问题是出在unsigned char *p=(unsigned char*)&input一行代码上,将一个char型的指针p指向了原来的input数组的首地址,考试时以为每次循环时向下进行的是两个字节,所以前5次循环每次都会取出A-E的一个数据,将其转换成相应的ASCII码,与s进行相加计算,错误就出现在这里,当运行unsigned char *p=(unsigned char*)&input这句代码之后,每次for循环char v=p[i],每次只向下进行一个字节的大小,而short型本身所占用的内存空间是两个字节,所以当i为奇数时,p[i]都是0,当i为偶数时,p[i]正好为数组中的数,所以最后的结果为30。

posted @ 2011-10-23 17:05  蓝色地中海  阅读(971)  评论(0编辑  收藏  举报