这是一位高级经理在面试时问的问题。
哪个更快?
while(1) {
// Some code
}
or
while(2) {
//Some code
}
我说过两者具有相同的执行速度,因为while中的表达式最终应求值为true或false。在这种情况下,两者都求值为true,并且while条件中没有额外的条件指令。因此,两者将具有相同的执行速度,我更喜欢while(1)。
但面试官自信地说:
“检查你的基本知识。While(1)比While(2)快。”
(他不是在试探我的信心)
这是真的吗?
请参见:“for(;;)”是否比“while (TRUE)”快?如果不是,人们为什么要使用它?
你的解释很正确。这似乎是一个在技术知识之外考验你自信的问题。
顺便说一下,如果你回答了
这两段代码同样快,因为它们都需要无限长的时间来完成
面试官会说
但是虽然(1)每秒可以做更多的迭代;你能解释一下原因吗?(这是无稽之谈;再次考验你的信心)
所以,通过像你那样回答,你节省了一些时间,否则你会浪费在讨论这个糟糕的问题上。
下面是编译器在我的系统(MS Visual Studio 2012)上生成的示例代码,优化关闭:
yyy:
xor eax, eax
cmp eax, 1 (or 2, depending on your code)
je xxx
jmp yyy
xxx:
...
打开优化后:
xxx:
jmp xxx
因此生成的代码是完全相同的,至少在优化编译器中是如此。
根据人们花费在测试、证明和回答这个非常直接的问题上的时间和精力来判断,我认为这两者都因为提出这个问题而变得非常缓慢。
所以花更多的时间在这上面…
虽然(2)很荒谬,因为,
While(1)和While (true)在历史上被用于创建一个无限循环,该循环预计在循环中的某个阶段根据一定会发生的条件调用break。
1只是为了总是求值为真,因此,说while(2)和说while(1 + 1 == 2)一样愚蠢,后者也会求值为真。
如果你想完全傻一点,就用:-
while (1 + 5 - 2 - (1 * 3) == 0.5 - 4 + ((9 * 2) / 4.0)) {
if (succeed())
break;
}
我认为面试官犯了一个错别字,这并不影响代码的运行,但如果他故意使用2只是为了表现得奇怪,那么在他把奇怪的语句贯穿你的代码,使其难以阅读和使用之前解雇他。