禾赛科技笔试复盘
楼主投的是C++岗位,今天做了笔试题,感觉没有发挥好,这里复盘一遍,加深印象,不让错误再犯。
总共是5道题,3个问答题,2道编程题
1. 给你如下一段代码,请分析执行之后的结果:
void foo(int &b){ static int a = 3; b += a++; } int main(){ int a = 4; int &b = a; b = a+1; foo(a); cout << a << " " << b << endl; b++; foo(b); cout << a << " " << b << endl; return 0; }正确答案
8, 8
13, 13
我第一次分析的时候,也是觉得foo函数的局部静态变量只会被创建一次,所以局部静态变量a第二次应该是4,没有坚持自己的分析,给了一个错误答案12
2. 阐述下面的代码意思:
int a[10] int *a[10]; int * const a[10] int (*a)[10] int (*a)(int) int* (*a[10])(int *)1. 整型数组
2. 指针数组
3. 顶层const修饰的指针数组
4. 数组指针
5. 函数指针
6. 函数指针数组
3. 给你如下一段代码,请分析执行之后的结果:
class A{ public: A(){ print(); } virtual void print(){ cout << "A" << endl; } }; class B : public A{ public: B(){ print(); } virtual void print(){ cout << "B" << endl; } }; int main(){ A a; B b; A *pa = &b; pa->print(); return 0; }正确答案:
A A B B
我的答案 A A B。我晕,这种不合理的代码,根本就没有去模拟过好吧。《Effective C++》明确指明不要在构造函数和析构函数中调用虚函数。在实例化类B的对象b时,会调用两次print,第一次是基类的print,第二次是派生类的print
4. 小端地址转大端地址
我代码写错了,下来之后自己又改了一遍,贴正确的代码:
对了,题目要求返回值是int32,也就是有符号的32位整型,这是不对的吧,这库的函数格式都是无符号的32位整型。我的代码是使用的无符号的32位整型
uint32_t func(string &ipaddr){ uint32_t t = 0; uint32_t ans = 0; int len = ipaddr.size(); vector<uint32_t> v; for(int i = 0; i < len; ++i){ if(ipaddr[i] != '.'){ t *= 10; t += ipaddr[i]-'0'; } else{ t = t << (v.size() * 8); v.push_back(t); t = 0; } } t = t << (v.size() * 8); v.push_back(t); for(auto n : v) ans += n; return ans; }5. 最后一个题,设计一个电梯程序,实现以下功能:
- 不使用的时候回到一楼;
- 运行过程中打印每一层楼;
- 对外一个接口,选择电梯要去的楼层
class Elev{ public: Elev(int n):_n(n), _pos(1){} void setF(int n){ run(n); } private: int _n; int _pos; void run(int n){ while(_pos != n){ cout << _pos << endl; _pos < n ? _pos++ : _pos--; } cout << _pos << endl; } };由于时间关系,不使用时返回一楼的方法没有实现
写到最后,复盘之后才发现,自己的笔试做的挺菜的,5个题感觉都做的不理想,还得加油啊!