如果我想重复任务100次,那么写作是否更好。
for (i = 0; i < 100; ++i) { ... }
或
for (i = 100; i > 0; --i) { ... }
答案 0 :(得分:4)
我会去#1。人类阅读代码更直观。如果无法实现性能优势,请始终选择更易读的解决方案。
答案 1 :(得分:1)
a:for (i = 0; i < 100; ++i) { ... }
b:for (i = 100; i > 0; --i) { ... }
这并不重要,但我使用A. B应该没问题,但如果你转到i >= 0
而不是i > 0
,如果i
未签名,则会出现问题。< / p>
答案 2 :(得分:1)
如果您不需要在循环中使用i
,或执行顺序无关紧要(迭代之间没有数据依赖关系),那么第二个可能是只是快一点。
但是第一个更容易让初级程序员阅读。根据其他人可能会查看代码,这可能是也可能不是问题。
我倾向于选择这个:
{
int i = 100;
do {
--i;
...
} while (i);
}
因为它有效,简洁,并为i
(0 .. 99,降序)提供相同的范围,不像第二个for循环,它给出{1}在1..100范围内(降序) )
答案 3 :(得分:1)
你没有陈述任何用例,所以“更好”在这里完全没有意义。
然而,为了理智,我会指出:
为了它而你只是数到100是非常不寻常的。如果你是,那么任何一个循环都等同于另一个循环。
但是,让我们考虑你是否正在迭代100个元素的数组,并且出于某种原因使用索引。你的索引计数器应该是无符号的,你应该在0到99之间计数。然后你的第二个循环应该是:
for (size_t i = 99; i >= 0; --i) { ... }
这里的问题是,在“最后”迭代中,当i
为0时,递减它会给你std::numeric_limits<size_t>::max()
,这是一个非常大的数字。 (这不是下溢:无符号值定义以在其范围的极限处进行环绕。)循环条件仍然满足,并且您获得无限循环。
一般情况下,使用无符号数量向后循环到0将无法正常工作。
当然,您可以通过更改要签名的计数器来解决此问题,但是您正在限制计数器的范围,并且在语义上,数组索引应该是无符号的。实际上,如果你这样做,你会看到“比较有符号和无符号值”警告。
因此,如果仅以这种方式,向后循环可能比向前循环更容易出错。
但是,再一次,没有特定的用例,没有任何人可以在这里呈现的具体建议。 没有“更好”的一般概念。
在这两者中肯定不会有任何固有的,明显的,有用的性能差异。
这取决于循环体的内容哪个是最合适的。
答案 4 :(得分:1)
第一个将以i
循环,范围从0到99(含);
第二个将以i
循环,范围从100到1(包括100和1)。
答案 5 :(得分:0)
这取决于循环中发生的事情。如果循环中的代码是循环不变的(不依赖于循环变量)那么你正在使用的编译器很可能会使用减量版本而不管你如何编写它。一般来说,为了便于阅读和维护代码,我建议使用增加循环计数器。为了性能,我建议使用减量版本,因为大多数CPU在与0进行比较时表现更好。
那就是说,现在有了处理器和预测分支/大量寄存器,你编写它的方式可能并不重要(用于测量性能)。除非你真的真的需要压缩性能,否则我建议你去寻求可读性(即便如此,这可能不是我最初想要的首选优化之一)。
答案 6 :(得分:0)
两者都一样。如果第二个: -
for (int i = 99; i >= 0; --i) { ... }
取决于你想在循环中做什么。除非有充分的理由不这样做,否则一般人都会数。倒计时会让看到你代码的其他程序员感到困惑。
例如,如果您要测试数组元素并在满足某些条件时删除它们,最好倒计时。