前言
现在是暑假留校近一个月的一个下午。两周时间里,我们草草完成了聊天室的项目,一周时间里就在改bug、写博客。在这个百无聊赖的下午,突然想起来去年的总结小组面试题的任务还一直拖欠着,我也就趁着今天下午的时间,把小组近三年来的面试题总结一下。希望来年可以给新生提供一点点参考。
2021年纳新试题
输出:
a = 127 ch = -128
解析:
char类型是有符号类型,表示范围为 -128~+127
因此,a = 127;
b = 128,二进制表示为 1000 0000,由于高阶位是1,表示该值为负值,再由二进制补码转化得出b的绝对值,即:
1 0000 0000 - 1000 0000 = 1000 0000 (128)
因此,ch = -128。
详细可参考《c primer plus》 15.1.2 有符号整数
输出:
Xi You Linux Group 2021
解析:
本题考察printf()函数的返回值,查看man手册我们可以知道:Upon successful return, printf() return the number of characters printed.(成功返回后,printf() 返回打印的字符数。)
即printf()函数返回打印的字符数。"Xi You Linux Group 20"有21个字符(包括空格),则先打印str,后打印返回值21
输出:
m = 1, n = 1
m = 2, n = 1
解析:
本题重点在于两个变量:m、n
其中:m是具有静态存储期的块作用域变量,n是具有自动存储期的块作用域变量
所谓具有静态存储期,其实就是指该变量储存在静态内存中,它从程序被载入到程序结束期间都存在。
本题考察《c primer plus》 12.1 存储类别相关内容
输出:
ch = A i = A f = A
解析:
本题考察移位运算符 >>/<<与ascii码的理解,重难点在变量f
*(int *)&f,考察取地址、强制类型转换以及解引用的知识。
在进行位移运算之前,先将f转化为二进制,然后再按位右移:
10000000000000000000000001 ==> 00000000000000000000000010 (2)
'?'的ascii码为63,63(?) + 2 = 65(A)
输出:
&a = 0x7fff604b9900 &a[0] = 0x7fff604b9900 &a[0][0] = 0x7fff604b9900
&a+1 = 0x7fff604b9910 &a[0]+1 = 0x7fff604b9908 &a[0][0]+1 = 0x7fff604b9904
解析:
本题考察对数组名的理解。注意,输出的结果为16进制,因此9900在加16字节之后变为9910。
作用:
给数组赋值,大小为数据下标的大小。
即array[0] = 0, array[1] = 1, array[100] = 100
问题:
函数get_array()返回的array是一个局部变量的地址
在函数get_array()结束之后,该地址内存上的数据被清除
即返回的是一个垃圾地址
修改:
输出:
16 8 25 24
解析:
本题考察对转义字符的理解
其中%zu输出size_t即unsigned int;
字符数组x中:\t表示移到下一个水平制表位,\b将当前位置移到前一列,\106表示’F’,106在ascii码中表示八进制的’F’。
输出:
XiyouLinuxGroup2021
Waiting for y0u!
解析:
本题考察C按位运算符,具体可参考:
《c primer plus》 15.3
输出:
第二个sacnf()输入的值
解析:
这道题考察对函数scanf()的理解。
scanf()是将读取到的数据存入一个内存地址中
第一个scanf()将变量a的地址赋值给变量c,这时变量c的内存存储的值为变量a的内存地址;
我们注意到:第二个scanf()没有取地址符’&’,因此,scanf()将输入的值赋值给地址&a
参考https://blog.csdn.net/no_compare_no_harm/article/details/89601004
输出:
XiyouLinuxGroup2021
解析:
本题考察大小端的内容
大端存储:就是把一个数的低位字节序的内容存放到高地址处,高位字节序的内容存放在低地址处。
小端存储:就是把一个数的低位字节序的内容存放到低地址处,高位字节序的内容存放在高地址处。
本题还有一个较难理解的点是(int const[ ]),int const[ ]可以抽象成int const *,而int const *与const int *没有任何区别,即指向一个整形常量的指针。
详细可参考https://blog.csdn.net/huangchijun11/article/details/72725463
这时将十六进制的ASCII码按大端存储的方式存放到内存中,将其强转为字符串类型((char *))并输出(puts)
本题考察一个简单的选择排序
输入:edcba
输出:abcde
Fibonacci数列第100项为3.542248e20
关于大数加法,可以参考https://blog.csdn.net/binxxi/article/details/111460452
除开大数加法,我们还可以使用一个非常简单的方法来求解。那就是双精度变量double
后记
还记得去年面试的时候我问了学长一个问题,“为什么我们明明是2020届的新生,但纳新题里总出现的是’XiyouLinuxGroup2021’呢?难道是你们为了凑字符数硬改成的2021?”
其实这是历史原因,因为小组以前是在下半学期才开始纳新,新入学的大一们在寒假过完之后就已经到了下一年了。
去年第一次来面试的那个早上下了很大的雪,拿着准备得并不充分的面试题就来到了实验室。
马上我们也要进入大二来迎接学弟学妹们了,我们要给出纳新试题,我们要在2021年秋季举办“XiyouLinuxGroup2022纳新宣讲会”,我们要在入冬之后开始面试。总之,欢迎大家的到来。