为什么在C系列语言中,当我们对任何循环使用计数器时,最优选的比较是Greater Equal To <=
还是反向?请看一下这三段代码
for (var i = 0; i <= 5; i++)
{...}/// loop1
for (var i = 0; i < 6; i++)
{...}/// loop2
for (var i = 0; i != 6; i++)
{...}/// loop3
我理解为什么不鼓励循环3,因为代码中的某些内容可以分配i > 5
导致无限循环。但loop1
和loop2
基本相同,而loop2
可能表现更好,因为只进行了一次比较。那么为什么loop1
更受欢迎。它只是惯例还是还有更多东西?
注意:我没有正式的编程培训。当我需要更好的工具来编程8051而不是使用汇编语言时,我就拿起了C.
答案 0 :(得分:10)
for循环通常用于迭代数组,限制是数组的长度。由于数组从零开始,因此最后一个有效元素为length-1
。所以选择是:
for (int i = 0; i < length; i++)
和
for (int i = 0; i <= length-1; i++)
第一个更简单,所以它是首选。结果,即使限制不是数组大小,这个习惯用法也很常见。
我们不使用!=
因为我们偶尔会编写循环,其中索引按可变步长递增,有时它会跳过限制。因此使用<
比较更安全,因此这些不会变成无限循环。
答案 1 :(得分:3)
这通常是上下文语义的问题,促进“跟随你的人”维护代码。
如果您需要10次迭代,通常会写为从0
开始并且结束条件为<
或!=
,因为这意味着10
是字面上是代码的一部分,因此清楚地表明了10次迭代。对于像C风格的字符串这样的基于零的数组,非包含符号也更实用。通常不建议使用带有!=
的表示法,因为如果索引器不仅仅是一个简单的增量,发生意外溢出等,它就会导致无限循环。
另一方面,如果你需要一个特定值的循环,那么如果你在代码中确实存在结束条件,那么它也更清晰,例如for(var i = 1; i <= 5; i++)
它很明显它是一个包容性循环从1到5。
这些只是引用使用一种符号或其他符号的常见原因,大多数优秀的程序员决定根据上下文和情况使用哪种。没有理由表现或以其他方式优先选择其他人。
答案 2 :(得分:3)
小于或等于不首选。传统上,在C中, 少于首选;在C ++中,不等于目前为止最多 地道。因此,在C:
#define N 100
int array[N];
for ( int i = 0; i < N; i ++ ) {
// ...
}
在C ++中,要么:
int const N = 100;
int array[N];
for ( int i = 0; i != N; ++ i ) {
// ...
}
甚至更经常,如果只有一个容器,那么 否则不需要索引:
for ( int* p = std::begin( array ); p != std::end( array ); ++ p ) {
// ...
}
(在C ++之前的版本11中,当然,我们使用了自己的实现 开始和结束做同样的事情。)
其他形式通常不是惯用的,仅用于 例外情况。
答案 3 :(得分:1)
除了上限之外,几乎所有for循环都具有完全相同的标题。这是一个有用的约定,有助于快速理解和减少错误。 (而且约定是<
,而不是<=
。不知道你从哪里得到它。)
在代码质量方面,做同样事情的程序不一定相同。编码风格有一个客观的组成部分,因为它可以帮助人们处理任务的复杂性。
一致性是一个重要目标。如果您有选择,请选择大多数团队成员正在使用的替代方案。