如果你不得不遍历一个循环7次,你会使用:
for (int i = 0; i < 7; i++)
或者:
for (int i = 0; i <= 6; i++)
有两个考虑因素:
为了提高性能,我假设使用Java或C#。使用“小于”或“小于或等于”有关系吗?如果您对不同的语言有洞察力,请指出是哪种语言。
为了提高可读性,我假设使用基于0的数组。
更新:我提到的基于0的数组可能把事情搞糊涂了。我不是在讨论迭代数组元素。只是一个通用的循环。
下面使用一个常量来解释这个神奇的数字,这是一个很好的观点。所以如果我有"int NUMBER_OF_THINGS = 7
“,那么"i <= NUMBER_OF_THINGS - 1
”看起来会很奇怪,不是吗?
发布于 2008-10-08 13:03:45
首先是更多的idiomatic。特别是,它指示(从0开始)迭代的次数。当使用基于1的东西(例如JDBC、IIRC)时,我可能会倾向于使用<=。所以:
for (int i=0; i < count; i++) // For 0-based APIs
for (int i=1; i <= count; i++) // For 1-based APIs
我希望在现实世界的代码中性能差异是微不足道的。
发布于 2008-10-08 13:02:32
这两个循环都迭代了7次。我会说里面有7的那个更易读/更清晰,除非你对另一个有很好的理由。
发布于 2008-10-08 13:30:33
我记得我在大学里做8086汇编的时候,做起来更有效率:
for (int i = 6; i > -1; i--)
因为有一个JNS操作,这意味着如果没有符号就跳转。使用这种方法意味着在每个周期之后不需要查找内存来获得比较值,也不需要进行比较。如今,大多数编译器都会优化寄存器的使用,所以内存问题不再重要,但你仍然会得到一个不必要的比较。
顺便说一下,将7或6放入你的循环中就是引入了一个"magic number“。为了更好的可读性,你应该使用一个常量和一个能揭示意图的名字。如下所示:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
编辑:人们没有得到组装的东西,所以显然需要一个更完整的例子:
如果我们使用(i = 0;i <= 10;i++),你需要这样做:
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
如果我们这样做(int i= 10;i> -1;i--),那么你可以这样做:
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
我刚刚检查了一下,微软的C++编译器不会做这种优化,但如果你做了,它就会做:
for (int i = 10; i >= 0; i--)
因此,如果你使用的是微软的C++†,升序或降序都没有区别,为了得到一个快速循环,你应该使用:
for (int i = 10; i >= 0; i--)
而不是这两个:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
但坦率地说,获得"for (int = 0;I <= 10;i++)“的可读性通常比缺少一个处理器命令重要得多。
†其他编译器可能会做不同的事情。
https://stackoverflow.com/questions/182600
复制相似问题