编辑:我忘了添加第二个代码的循环部分。
查看两种代码样式
while(some_loop_cont_val)
{
while(pre_x is not done)
{
//do action pre_x
}
//do action x
}
和
while(some_loop_cont_val)
{
if(pre_x is not done)
{
//do action pre_x
}
else
{
//do action x
}
}
第一个循环执行pre_x(可能是迭代操作),然后是x,第二个循环执行pre_x的一部分,如果没有完成,则继续执行直到完成,然后执行x。所以两者都做pre_x然后做x。
我想知道两者之间是否存在任何差异,无论是在效率方面,还是在其他方面(例如:如果有一些微妙的影响,很少会出现,& c。),或者如果有的话是否有理由在特定情况下使用一个而不是另一个,或者只是一个偏好问题。
答案 0 :(得分:4)
在第一个例子中,第二个while循环可能实际循环。
第二个示例有条件地提交两个不同的动作。
答案 1 :(得分:1)
break
语句不允许您退出外部循环。因此,您将错过break
/ continue
语句引入的一些有用功能。比较:
while(some_loop_cont_val) {
if(some_det) {
break;
}
}
//"break" takes you here
和
while(some_loop_cont_val){
while(some_det) {
break;
}
//"break" takes you here
}
另一件事是“while”循环至少需要两次比较:在第一次迭代时输入它而不在第二次迭代中输入它。
答案 2 :(得分:0)
拜托,请不要担心这些事情的效率!!!
action
代码必须几乎没有让您注意到差异。
如果几乎没有,和分析显示程序计数器在该循环中花费的时间超过10%,那么就担心它的效率。然后,如果你愿意,你可以展开循环或做其他聪明。
答案 3 :(得分:0)
要记住的重要一点是,机器代码级别仍然是某些描述的跳转语句。你唯一能做到的就是使用语言功能来解决其设计之外的其他问题。
在某些低级编程(驱动程序等)中,可能需要进行此优化 - 但我对此表示怀疑。如果你达到那个级别,那么用汇编程序编写东西或使用宏来隐藏歧义可能是一件好事。
答案 4 :(得分:0)
如果对代码进行适当的更改以使逻辑相等,由于cpu更好的分支预测,使用一个循环将更有效(一个循环比两个循环更容易预测 - 您可能会有更少的错误预测这样)
有关分支预测的更多信息:http://en.wikipedia.org/wiki/Branch_predictor
答案 5 :(得分:0)
如果内循环的条件保持为真,则当外循环的条件变为假时,第一个样式的内循环将继续迭代。
相反,无论if条件是否为真,if-branch都不能在外循环条件变为false时重复执行。
(并重复其他人所说的:if-else不是循环。就像while,它是一个控制结构,但它不是循环。)
答案 6 :(得分:0)
这两者的逻辑完全不同。
如果some_loop_cont_val
为真且操作pre_x 使some_loop_cont_val
为false,只有您的第一个示例将执行操作x
答案 7 :(得分:-2)
效率和偏好是irellevent,两个代码片段在任何方面都不相同。 if-else
不是循环结构。