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