从面试问题看国外程序员
很喜欢在http://stackoverflow.com上浏览,作为知名的IT技术交流园地,这里聚集了大量优秀的技术人员,当然也不乏众多初学者在上面提问。提问的规则很简单,homework或者求代码这样的贴是会被立即删除的,老外都很看重这一点,提问者至少也要对自己所提出的问题做出一定的分析和尝试,然后才是求助。
昨天浏览时看到一个帖子比较有意思,一名网友发了一道他在面试时遇到的问题,希望大家能给出解答。我看了其他人的回帖后,觉得国外的程序员真的是太有才了。
问题是这样的:
不改变表达式的结果,化简表达式
s -= s>73?61:60;
提示为:把表达式中的条件操作符改成使用比较操作符。
这位网友的分析是:我不确定,不过我想这可能要用到某些GCC的扩展特性,尽管我自己想不出怎么做。
下面的回帖精彩了...
Neil Butterworth -- 你不会想为在面试中出这种题目的人一起工作的。
Mike Mooney -- 正确的答案是:去那些能够问些值得回答的问题的地方面试。
Carl Norum -- 这是给那些不理解面试到底是为了什么的人准备的。
Mike Mooney -- 是的,一些面试官对他们自己的能力感到非常骄傲,他们告诉自己要雇佣的人必须足够聪明才能够回答出他们晦涩含糊没有意义的问题,而实际上他们只是想让
可怜的求职者知道他们自己是多么的聪明。
Mike Mooney随后给出了解答与说明:
s -= (s > 73) + 60;
上面的表达式能够完成这个问题的要求,C标准6.5.8节第6自然段规定了:对于 >, <, >=, <=操作符,如果指定的关系为true则结果是1,如果是false则结果为0,结果的类型为int。
AraK -- 一个糟糕问题的优雅解决。
Johannes Schaub - litb -- 上面的解决方法也适用于C++,C++中比较运算的结果类型为bool,后面的+操作符使bool类型提升为int,因此bool的true提升为1,false提升为0,假设这里的s是一个普通的int,而不是什么class的实例
Mike Mooney -- 对于你的C++解释加1分!
Bill -- 怎么化简这个表达式?这样如何?
1 typedef int Price;
2 Price getPriceAfterRebate(const Price priceBeforeRebate)
3 {
4 const Price normalRebate = 60;
5 const Price superRebate = 61;
6
7 const Price superRebateThreshold = 73;
8
9 Price returnValue = priceBeforeRebate;
10 if (priceBeforeRebate > superRebateThreshold)
11 {
12 returnValue -= superRebate;
13 }
14 else
15 {
16 returnValue -= normalRebate;
17 }
18 return returnValue;
19 }
哈哈,一行丑陋的无法维护(unmaintainable )的代码“化简”成了一段可读性高的易于维护的代码段。(这哥们开始玩起来了)
Johannes Schaub - litb -- lol (大笑)
Ari -- 很有娱乐性,+1分。
Bill -- 很高兴你们喜欢。
John Marshall -- (s>5)的结果是什么?你可以对它做算术运算吗?如果没看问题的提示,我得说这是个“吃定你了”的问题,这需要灵光一闪才有可能想到,而这完全与面试者的能力无关。看了提示后,不得不说...很棒,但很隐晦。
OK,看完这个贴,我发现两点。
1. 国外的程序员对标准这种东西的熟悉程度很高。至少,当遇到问题的时候他们会想到求助于标准手册。而我自己可能会选择做几个小实验去测验下结果。
2. program for fun