在 C 系列中,为啥在循环中“小于或等于”比“小于”符号更受欢迎? [关闭]
Posted
技术标签:
【中文标题】在 C 系列中,为啥在循环中“小于或等于”比“小于”符号更受欢迎? [关闭]【英文标题】:In C families, in a loop why is "less than or equal to" more preferred over just "less than" symbol? [closed]在 C 系列中,为什么在循环中“小于或等于”比“小于”符号更受欢迎? [关闭] 【发布时间】:2014-02-22 11:31:03 【问题描述】:为什么在 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
更受欢迎。这只是惯例还是有其他内容?
注意:我没有接受过正规的编程培训。当我需要更好的工具来编写 8051s 而不是使用汇编语言时,我才选择了 C。
【问题讨论】:
谁说<=
更好?
我认为您的意思是循环 3 中的 != 6
。
@jrok 如果您看到代码示例,它们都在使用<=
。
这些例子都不是我写的,然后:D
@AwfullyAwesome 大于或小于。
【参考方案1】:
For 循环通常用于遍历数组,限制是数组的长度。由于数组是从零开始的,最后一个有效元素是length-1
。所以选择是:
for (int i = 0; i < length; i++)
和
for (int i = 0; i <= length-1; i++)
第一个比较简单,所以首选。因此,即使限制不是数组大小,这种习惯用法也很常见。
我们不使用!=
,因为有时我们会编写索引以可变步长递增的循环,有时它会跳过限制。所以使用<
比较更安全,这样就不会变成无限循环。
【讨论】:
你没有给i
一个类型,所以也许还值得指出的是,如果i
是unsigned
,而length
为零,那么第二个循环将完全执行某些操作错了。【参考方案2】:
这通常是上下文语义的问题,便于“追随者”维护代码。
如果你需要 10 次迭代,这通常写成从 0
开始,并以 <
或 !=
为结束条件,因为这意味着 10
实际上是代码的一部分,因此显示很明显,打算进行 10 次迭代。非包含符号对于从零开始的数组(如 C 样式字符串)也更实用。通常不鼓励使用 !=
表示法,因为如果索引器不仅仅是一个简单的增量、发生意外溢出等情况,它可能会导致无限循环。
另一方面,如果您需要一个往返于特定值的循环,那么如果您在代码中确实有结束条件,例如for(var i = 1; i <= 5; i++)
,就可以清楚地看出这是一个包容性循环从 1 到 5。
这些只是使用一种或另一种表示法的常见原因,大多数优秀的程序员会根据上下文和情况决定使用哪种表示法。没有理由选择性能或其他方面。
【讨论】:
@SteveJessop 澄清了一点,谢谢评论。!=
符号是迄今为止 C=+ 中最常见和首选的形式,因为它模仿了使用迭代器编写循环的方式。【参考方案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 之前的版本中,我们使用了自己的实现 begin 和 end 做同样的事情。)
其他形式一般不习惯用,只用在 特殊情况。
【讨论】:
终于有人解决了实际问题。【参考方案4】:除了上限之外,几乎所有的 for 循环都有完全相同的标题。这是一个有用的约定,有助于快速理解并减少错误。 (约定是<
,而不是<=
。不知道你从哪里得到的。)
在代码质量方面,执行相同操作的程序不一定相同。编码风格有一个客观的组成部分,它可以帮助人类处理任务的复杂性。
一致性是一个重要目标。如果您可以选择,请选择大多数团队成员都在使用的替代方案。
【讨论】:
以上是关于在 C 系列中,为啥在循环中“小于或等于”比“小于”符号更受欢迎? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章