在C族中,在循环中为什么“小于或等于”比“小于”符号更优先?

时间:2014-02-22 11:31:03

标签: c# c++ c

为什么在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导致无限循环。但loop1loop2基本相同,而loop2可能表现更好,因为只进行了一次比较。那么为什么loop1更受欢迎。它只是惯例还是还有更多东西?

注意:我没有正式的编程培训。当我需要更好的工具来编程8051而不是使用汇编语言时,我就拿起了C.

4 个答案:

答案 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循环都具有完全相同的标题。这是一个有用的约定,有助于快速理解和减少错误。 (而且约定是<,而不是<=。不知道你从哪里得到它。)

在代码质量方面,做同样事情的程序不一定相同。编码风格有一个客观的组成部分,因为它可以帮助人们处理任务的复杂性。

一致性是一个重要目标。如果您有选择,请选择大多数团队成员正在使用的替代方案。