学了一个月的C++课, 今天晚上(其实现在是0:11, 我指的就是"昨天晚上"了)上机考试, 我预计中老师出的考试题是这样的: 不会考模板, 不会考COM, 不会考函数对象这样生僻的东西, 当然不会考算法. 因为这些主题不在普通C++程序员日常操练之列. 预计象我这样虽然没有多少真功夫但对C/C++水平一向自负的人应该能提前搞定.
结果出乎我预料, 没考COM(这个老师声明过), 但不止一道题考了模板, 占的份量很重, 考了排序算法, 考了函数对象. 考? 靠!
我一看第一题就有点头大, 要写一个通用的排序算法, 能对任意对象排序, 至少用int, float, double来测试, 要求用模板, 用函数对象. 直觉让我把它放在后面.
打开久违的VC6 开发环境, 生成一个控制台Hello world项目, 这个决策相当英明, 接下来我在这上面没有浪费什么时间.
真正让我头痛的是第二道题, 要求很简单, 就是实现一个类, 使它的对象可以用 cout << obj 这样写法. 我虽然很少会写这样的代码, 但是开卷考试, 我还背了本<
>去, 还有老师讲师的PPT, 应该不是难事, 但不知何故VC6的编译器就是通不过. 编译不通过对C++老手来说是个莫大的侮辱, 这意味一个低级错误, 我最终还是把这道题放在了最后面. 心想这道题全当放弃了, 4道做出来3题, 最后一道题是老师给的附加值题, 做对了的话老师兴许会给多加两分. 因为这道题和第一题造成的问题, 我就没动过最后一道题的心思.
略微有些不爽地回到家, 玩了一会之后, 把用U盘COPY回来的题目拿出来准备研究, 发现机上上VC6没装, .NET没装, cygwin中的gcc 使用起来有问题, 启动VMWARE, 打开我的linux, 把这道题拿过去编, 嘿! 过了, 结果也顺序地出来了, 这下可爽了, gcc编译器我是信得过的, 但VC6 却未必可靠. 我就一直呐闷这个语法我还是记得的, 为什么一直编不过去. 把几个考试题都用FTP传到 Linux上:
for i in ex*.cpp; do gcc -o ${i/.cpp} $i -lstdc++ && ./${i/.cpp}; done
太爽了, 一个警告也没给我. 这说明俺的考试程序写得还算是符合标准.
第一道题难度最大, 我几乎在最后一秒钟才把它调试正确, 让我反复折磨了好几遍. 也许这应允了那句话:90%的计算机科学家在90分钟之内写不出一个正确的快速排序算法. 计算机编程就是这样, 知易行难. 难怪清华把"行胜于言"作为第二校训.
又想起VC6的另一罪状: 前几天一个班里的同学说他有个问题, VC6中一个全局对象的析构函数不会被调用, 原因是他的析构函数里别的事没干, 就用cout输出了一个字符串:
~Type()
{
cout << "~Type" << endl;
}
我机器上装的是.NET 2003, 用里面的VC7给他一试, 没问题, 析构函数被调用了. 但他坚持说他那不行. 我只好找了个有VC6的机器, 一试, 果不其然. 怀疑到VC6中cout上, 换成puts("~Type"); 一切OK.
VC6的问题有时候真是错的有点太离谱.
呵呵, 突然想到我把考试题也带回来了, 想到我今天评测了4款OCR软件, 想到我有相机, 何不把题目OCR出来呢?....
OCR结果惨不忍睹. 算了. 把图片贴上来吧.
阅读(834) | 评论(0) | 转发(0) |