首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否应该在for循环中使用<或<=

是否应该在for循环中使用<或<=
EN

Stack Overflow用户
提问于 2008-10-08 12:59:57
回答 39查看 42.9K关注 0票数 128

如果你不得不遍历一个循环7次,你会使用:

代码语言:javascript
复制
for (int i = 0; i < 7; i++)

或者:

代码语言:javascript
复制
for (int i = 0; i <= 6; i++)

有两个考虑因素:

  • performance
  • readability

为了提高性能,我假设使用Java或C#。使用“小于”或“小于或等于”有关系吗?如果您对不同的语言有洞察力,请指出是哪种语言。

为了提高可读性,我假设使用基于0的数组。

更新:我提到的基于0的数组可能把事情搞糊涂了。我不是在讨论迭代数组元素。只是一个通用的循环。

下面使用一个常量来解释这个神奇的数字,这是一个很好的观点。所以如果我有"int NUMBER_OF_THINGS = 7“,那么"i <= NUMBER_OF_THINGS - 1”看起来会很奇怪,不是吗?

EN

回答 39

Stack Overflow用户

回答已采纳

发布于 2008-10-08 13:03:45

首先是更多的idiomatic。特别是,它指示(从0开始)迭代的次数。当使用基于1的东西(例如JDBC、IIRC)时,我可能会倾向于使用<=。所以:

代码语言:javascript
复制
for (int i=0; i < count; i++) // For 0-based APIs

for (int i=1; i <= count; i++) // For 1-based APIs

我希望在现实世界的代码中性能差异是微不足道的。

票数 292
EN

Stack Overflow用户

发布于 2008-10-08 13:02:32

这两个循环都迭代了7次。我会说里面有7的那个更易读/更清晰,除非你对另一个有很好的理由。

票数 72
EN

Stack Overflow用户

发布于 2008-10-08 13:30:33

我记得我在大学里做8086汇编的时候,做起来更有效率:

代码语言:javascript
复制
for (int i = 6; i > -1; i--)

因为有一个JNS操作,这意味着如果没有符号就跳转。使用这种方法意味着在每个周期之后不需要查找内存来获得比较值,也不需要进行比较。如今,大多数编译器都会优化寄存器的使用,所以内存问题不再重要,但你仍然会得到一个不必要的比较。

顺便说一下,将7或6放入你的循环中就是引入了一个"magic number“。为了更好的可读性,你应该使用一个常量和一个能揭示意图的名字。如下所示:

代码语言:javascript
复制
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)

编辑:人们没有得到组装的东西,所以显然需要一个更完整的例子:

如果我们使用(i = 0;i <= 10;i++),你需要这样做:

代码语言:javascript
复制
    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--),那么你可以这样做:

代码语言:javascript
复制
    mov esi, 10
loopStartLabel:
                ; Do some stuff
    dec esi
                ; Note no cmp command on next line
    jns exitLoopLabel
    jmp loopStartLabel
exitLoopLabel:

我刚刚检查了一下,微软的C++编译器不会做这种优化,但如果你做了,它就会做:

代码语言:javascript
复制
for (int i = 10; i >= 0; i--) 

因此,如果你使用的是微软的C++†,升序或降序都没有区别,为了得到一个快速循环,你应该使用:

代码语言:javascript
复制
for (int i = 10; i >= 0; i--)

而不是这两个:

代码语言:javascript
复制
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)

但坦率地说,获得"for (int = 0;I <= 10;i++)“的可读性通常比缺少一个处理器命令重要得多。

†其他编译器可能会做不同的事情。

票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/182600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档