我已经看到在这两种方式中使用For循环。使用!
而不是使用<
是否有任何积极的方面?哪一个更快?
for (i = 0; i != imax; ++i)
{
}
或
for (i = 0; i < imax; ++i)
{
}
答案 0 :(得分:7)
使用是否有任何积极的方面!而不是使用&lt; ?
这种情况极不可能发生。对于给定的例子,使用后者更具语义性,因为它表达了你的真实意图。
哪一个更快?
你永远不应该记住你的代码。做得对,然后快速做。您的代码最初设计和维护得越好 - 优化它就越容易(如果需要优化的话)。
答案 1 :(得分:4)
哪一个更快?
要回答这个问题,我们需要进入较低级别的编程甚至是机器级别,因为无法通过更高级别的编程来解答技术说明。
首先,让我们看看汇编语言如何执行循环。在开始之前,我想告诉我,我已经使用了许多源代码,汇编语言,架构标志,处理器等的实际实现各不相同。我不想写这么多汇编代码,所以我要添加http://www.cs.colostate.edu/~fsieker/misc/CtoLC3.html
的截图在下面给出的图像中,您可以看到条件逻辑表达式如何转换为数值表达式。类似的事情发生在循环中。数值表达式的LHS是由处理器的ALU(算术逻辑单元)在机器级执行的。根据LHS的结果,即(a-b),执行条件跳跃(分支)
循环的实现如下:
对于所有条件,表达式(a-b)的值由处理器的ALU计算。 ALU从未执行过 减法,它只能做加法。它只是将正在减去的两个数字补码加到第一个数字上。
例如,当&#39; a&#39; &安培; &#39; B&#39;被送到ALU,它增加了一个&#39;赞美&#39; b&#39;并给出输出。 随之而来的是它提出了相应的“旗帜”。如下所示(参考https://courses.engr.illinois.edu/ece390/books/labmanual/assembly.html)
根据各种标志值的值,执行分支。示例如下所示:
无论使用什么标志,您都可以看到,无论是&#39;!=&#39;,&#39;&gt;&#39;,&#39;&gt; =&#39;,处理器总是表演&#39;(ab)&#39;取决于结果&#39; Flags&#39;,&#39; Program Counter&#39;使用&#39;数字逻辑&#39;增加获取下一条指令,根据条件,该指令可以在循环体内或循环体外。这两个来源可以为您提供有关机器级别实现的一点信息(但是,它不是必需的,但只有在您希望进一步深入时才会这样做。)
http://minnie.tuhs.org/CompArch/Tutes/week02.html
http://people.tamu.edu/~akshitdayal/468/MIPS-Implementation.pdf
所以,它不会让它变得快。但是,第二次实施&#39; i&lt; IMAX&#39;如果要满足的逻辑条件是小于imax&#39;是正确的。和&#39;我!= imax&#39;如果逻辑条件是'不等于imax&#39;则是正确的。在你的情况下,它没有影响,但假设,如果增量不是++ i或i ++但i = i + 2且条件是&#39;我小于imax&#39;,则有可能它变成无限循环如果&#39; i!= imax&#39;用来。 编码应该始终是其背后的基本逻辑推理的表现。 :)
答案 2 :(得分:2)
它们中没有一个实际上“更快”。它取决于“imax”的值。例如,在你的第一个代码中,如果“imax”不等于零(小于零),'for'循环将永远不会停止
答案 3 :(得分:2)
不太可能执行速度存在任何可衡量的差异。
但是阅读这段代码的速度存在显着差异。您以不寻常的方式编写了for
循环,向读者表明这个特定循环有一些特殊之处。它使得阅读这些代码更耗时(需要了解特殊版本代码背后的原因,如果有的话),并因此使更难进行改进。
在C#中编写for
循环的常用方法:
for (i = 0; i < imax; i++)
{
....
}
几乎任何其他编写循环的方式都会导致您作为开发人员停下来并花费额外的时间来阅读并理解为什么原始编写者为该特定循环执行了特殊操作。
注意:“通常”可能因项目而异,因此如果您使用的代码始终使用其他样式,例如Yoda notation,请将代码与其余代码对齐,然后使用++i
甚至{{1只要它匹配其余代码的样式。
注意2:我的帖子被证明是https://softwareengineering.stackexchange.com/questions/70996/versus-as-condition-in-a-for-loop的精确副本,其中非常详细地介绍了C ++推理。幸运的是,C#具有imax > i
的本机迭代,并且不需要关注“代码在整数和迭代器索引之间看起来相同”。
答案 4 :(得分:1)
不幸的是,速度没有优势。但是你可以反复争辩,看起来更好,或更安全;特别是如果有人出现并在6个月内在for循环中添加额外的++ i。
答案 5 :(得分:1)
for (i = 0; i != imax; ++i)
程序员引起的错误很容易引起注意。大多数人都习惯看到这个版本:
for (i = 0; i < imax; ++i)
因此,他们可能会快速解析它并说'#34;是的,那是从{0到imax - 1&#34;的for
。
考虑到i
将留在[0, imax)
内,他们可能只是写一个快速的黑客来解决一个假设的问题,基本上改变了循环内i
的值。然后他们注意到在某些情况下i
变得大于或等于imax
并且循环继续。
关于速度,不,这不应该是要考虑的因素。