【计算机类职业资格】程序员面试-3及答案解析.doc
《【计算机类职业资格】程序员面试-3及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】程序员面试-3及答案解析.doc(35页珍藏版)》请在麦多课文档分享上搜索。
1、程序员面试-3 及答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:28,分数:100.00)1.一些结构声明中的冒号和数字是什么意思 (分数:3.00)_2.最有效的计算 2 乘以 8 的方法是什么 (分数:3.00)_3.如何实现位操作求两个数的平均值 (分数:3.00)_4.unsigned int i=3;printf(“%u/n“,i*-1)输出为多少 (分数:3.00)_5.如何求解整型数的二进制表示中 1 的个数 (分数:3.00)_6.不能用 sizeof()函数,如何判断操作系统是 16 位还是 32 位的 (分数:3.00)_7.嵌入式编程中,什么是大
2、端?什么是小端 (分数:3.00)_8.考虑 n 位二进制数,有多少个数中不存在两个相邻的 1 (分数:3.00)_9.不用除法操作符如何实现两个正整数的除法 (分数:3.00)_10.怎么样写一个接受可变参数的函数 (分数:3.00)_11.函数指针与指针函数有什么区别 (分数:3.00)_12.C+函数传递参数的方式有哪些 (分数:3.00)_13.重载与覆盖有什么区别 (分数:4.00)_14.是否可以通过绝对内存地址进行参数赋值与函数调用 (分数:4.00)_15.默认构造函数是否可以调用单参数构造函数 (分数:4.00)_16.C+中函数调用有哪几种方式 (分数:4.00)_17.什
3、么是可重入函数?C 语言中如何写可重入函数 (分数:4.00)_18.int a22=1,2,3,则 a01的值是多少 (分数:4.00)_19.如何合法表示二维数组 (分数:4.00)_20.a 是数组,(int*)(scanf(“%s“,str)是否安全 (分数:4.00)_23.行存储与列存储中哪种存储效率高 (分数:4.00)_24.全局变量和静态变量有什么异同 (分数:4.00)_25.局部变量需要“避讳”全局变量吗 (分数:4.00)_26.如何建立和理解非常复杂的声明 (分数:4.00)_27.变量定义与变量声明有什么区别 (分数:4.00)_28.不使用第三方变量,如何交换两个
4、变量的值 (分数:4.00)_程序员面试-3 答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:28,分数:100.00)1.一些结构声明中的冒号和数字是什么意思 (分数:3.00)_正确答案:()解析:C 语言的结构体可以实现位段,它的定义形式是在一个定义的结构体成员后面加上冒号,然后是该成员所占的位数。位段的结构体成员必须是 int 或者 unsigned int 类型,不能是其他类型。位段在内存中的存储方式是由具体的编译器决定的。 首先,定义位段的长度不能大于存储单元的长度。存储单元是指该位段的类型大小,不是计算机的存储单元字节。其次,一个位段如果不能放在一个存储单
5、元里,那么它会把这个存储单元中剩余的空间闲置,而从下一个存储单元开始存储下一个位段,即一个位段不能存储在两个存储单元内,位段在一个存储单元中的存储是紧凑的。再次,位段名缺省时称作无名位段,无名位段的存储空间通常不用,而位段长度为 0 位表示下一个位段存储在一个新的存储单元中,位段长度为 0 的时候位段名必须缺省(不能定义位段名)。最后,一个结构体中既可以定义位段成员也可以同时定义一般的结构体成员。这个时候,一般成员不和位段存储在同一个存储单元中。 程序示例分析如下: #includestdio.h typedef struct int a:2: int b:2: int c:1: test;
6、int main() test t; t.a=1; t.b=3; t.c=1; printf(“%d/n%d/n%d/n“,t.a,t.b,t.c); return 0; 程序输出结果: 1 -1 -1 由于 a 占两位,而 a 被赋值为 1,二进制就是 01,因此%d 输出的时候输出 1;b 也占了两位,赋值为 3,二进制也就是 11,由于使用了%d 输出,表示的是将这个 b 作为有符号 int 型来输出,这样的话二进制的11 将会有一位被认为是符号位,并且两位的 b 也会被扩展为 int 类型,也就是 4 字节,即 32 位。其实 a也做了这种扩展,只是扩展符号位的时候,由于数字在计算机中
7、存储都是补码形式,因此扩展符号位的时候正数用 0 填充高位,负数则用 1 填充高位。因此对于 a 来说,输出的时候被扩展为 00000000 00000000 00000000 00000001,也就是 1,而 b 则扩展为 11111111 11111111 11111111 11111111,也就是-1 了,c的显示也是这样的。2.最有效的计算 2 乘以 8 的方法是什么 (分数:3.00)_正确答案:()解析:23。 虽然直接进行乘法操作符运算也可以进行 2 与 8 的相乘,但是该种方法并非最优,通过移位方法会比较高效。因为将一个数左移 n 位,相当于乘以了 2 的 n 次方。因此,一个
8、数乘以 8,而 8 是 2 的 3 次方,所以只要该数左移 3 位即可实现乘以 8 的目的。 常规的乘法运算也可以实现,但 CPU 直接支持位运算,效率最高,所以操作 2 乘以 8 的最有效的方法是23。 引申:如何快速求取一个整数的 7 倍? 相比移位运算,如果直接使用乘法运算符的话,则执行效率相对比较慢,所以快速的方法就是将这个乘法转换成加减法和移位操作。由于移位运算相当于乘法运算或除法运算,左移相当于乘法运算,右移运算相当于除法运算,所以此时可以先将此整数左移 3 位(相当于将数字乘以 8),然后再减去原值,即(x3)-x 就获得了 x 的 7 倍。此处需要注意的是,由于-的优先级高于,
9、所以不能去掉括号,否则结果不正确。3.如何实现位操作求两个数的平均值 (分数:3.00)_正确答案:()解析:一般而言,求解平均数的方法就是将两者相加,然后除以 2,以变量 x 与 y 为例,两者的平均数为(x+y)/2。 但是采用上述方法,会存在一个问题,当两个数比较大时,如两者的和大于了机器位数能够表示的最大值,可能会存在数据溢出的情况,而采用位运算方法则可以避免这一问题,(x printf(“%d/n“,(x+y)/2); printf(“%d/n“,(x return 0; 在 32 位机器下,程序输出结果如下: -1 2147483647 程序的输出正好验证了这一算法的可行性。 引申
10、:如何利用位运算计算数的绝对值? 以 x 为负数为例来分析。因为在计算机中,数字都是以补码的形式存放的,求负数的绝对值,应该是不管符号位,执行按位取反,末位加 1 操作即可。 对于一个负数,将其右移 31 位后会变成 0xfffffff,而对于一个正数而言,右移 31 位则为 0x00000000,而 0ffffffffx+x=-1,因为 10111111=0100,任何数与 1111 异或,其实质都是把 x 的 0 和 1 进行颠倒计算。如果用变量 Y 表示 x 右移 31 位,(xy)-y 则表示的是 x 的绝对值。 程序示例如下: #includestdio.h int MyAbs(in
11、t x) int y; y=x31; return (xy)-y;此处还可以写为(x+y)y int main() printf(“%d/n“,MyAbs(2); printf(“%d/n“,MyAbs(-2); return 0; 程序输出结果: 2 2 上例中,在函数 MyAbs 中,对局部变量 y 进行赋值时,由于是对 X 进行右移 31 位,如果 x 为正数,则y=0;如果 x 为负数,则 y=-1。4.unsigned int i=3;printf(“%u/n“,i*-1)输出为多少 (分数:3.00)_正确答案:()解析:运行如下程序: #includestdio.h int ma
12、in() unsigned int i=3; printf(“%u/n“,i*-1); return 0; 程序输出结果: 4294967293 在 32 位机器中,i*-1 的值为 4294967293。在 32 位机器中,无符号 int 的值域是0,4294967295,有符号 int 的话,值域是-2147483648,2147483647,两个值域的个数都是 4294967296 个,即 0,4294967295=0,2147483647U2147483648,4294967295 有符号 int 的-2147483648,-1对应于无符号 int 的2147483648,429496
13、7295区域,两个区域的值是一一映射关系。所以,-1 对应 4294967295,-2 对应 4294967294,-3 对应 4294967293。 引申:unsigned short A=10; printf(“A=%u/n“,A);输出是什么? 因为 A 为无符号短整型变量,值为 10,在 32 位机器中,转换为二进制为 0000 0000 0000 0000 0000 0000 0000 1010,对 A 取反操作,所以A 的二进制位为 1111 1111 1111 1111 1111 1111 1111 0101,十六进制表示即为 0xFFFFFFF5,而如果将该数转换为符号整型的话
14、则为-11,因为输出的是无符号整型,无符号整型的范围为 04294967295,而 0xFFFFFFF5 转换为无符号十进制整型为 4294967285。 所以程序的输出结果为 4294967285。5.如何求解整型数的二进制表示中 1 的个数 (分数:3.00)_正确答案:()解析:求解整型数的二进制表示中 1 的个数有以下两种方法: 方法一,程序代码如下: #includestdio.h int func(int x) int countx=0; while(x) countx +; x=x return countx; int main() printf(“%d/n“,func(9999
15、); return 0; 程序输出结果: 8 在上例中,函数 func()的功能是将 x 转化为二进制数,然后计算该二进制数中含有的 1 的个数。首先以9 为例来分析,9 的二进制为 1001,8 的二进制为 1000,两者执行 while(n) count+=n n=1; return count; int main() printf(“%d/n“,func(9999); return 0; 程序输出结果: 8 需要注意的是,上例中,0xlu 表示的是十六进制的无符号数 1。6.不能用 sizeof()函数,如何判断操作系统是 16 位还是 32 位的 (分数:3.00)_正确答案:()解析
16、:如果没有强调不许使用 sizeof,一般可以使用 sizeof 计算字节长度来判断操作系统的位数,如在32 位机器上,sizeof(int)=4,而在 16 位机器上,sizeof(int)=2。除此之外,还有以下两种方法。 方法一:一般而言,机器位数不同,其表示的数字的最大值也不同,根据这一特性,可以判断操作系统的位数。 例如,运行如下代码: #include stdio.h int main() int i=65536; printf(“%d/n“,i); int j=65535; printf(“%d/n“,j); return 0; 由于 16 位机器下,无法表示这么大的数,会出现越
17、界情况,所以程序输出为 0 -1 而在 32 位机器下,则会正常输出,程序输出为 65536 65535 之所以会有区别,是因为在 16 位机器下,能够表示的最大数为 65535,所以会存在最高位溢出的情况。当变量的值为 65536 时,输出为 0;当变量的值为 65535 时,输出为-1。而在 32 位机器上,则不会出现溢出的情况,所以输出为正常输出。 方法二:对 0 值取反,不同位数下的 0 值取反,其结果不一样。例如,在 32 位机器下,按位取反运算,结果为 11111111111111111111111111111111。运行如下代码: #include stdio.h int mai
18、n() unsigned int a=0: if(a65536) printf(“32 位/n“); else printf(“16 位/n“); return 0; 程序输出为 32 位7.嵌入式编程中,什么是大端?什么是小端 (分数:3.00)_正确答案:()解析:采用小端模式的 CPU 对操作数的存放方式是从低字节到高字节,而大端模式对操作数的存放方式是从高字节到低字节。例如,16 位宽的数 0x1234 在小端模式 CPU 内存中的存放方式(假设从地址 0x4000 开始存放)见下表 1,而在大端模式 CPU 内存中的存放方式见表 2。 表 1 0x1234 在小端模式 CPU 内存中
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 程序员 面试 答案 解析 DOC
