在 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 &gt; 5 导致无限循环。但是loop1loop2 本质上是相同的,而loop2 在性能方面可能更好,因为只进行了一次比较。那么为什么loop1 更受欢迎。这只是惯例还是有其他内容?

注意:我没有接受过正规的编程培训。当我需要更好的工具来编写 8051s 而不是使用汇编语言时,我才选择了 C。

【问题讨论】:

谁说&lt;=更好? 我认为您的意思是循环 3 中的 != 6 @jrok 如果您看到代码示例,它们都在使用&lt;= 这些例子都不是我写的,然后:D @AwfullyAwesome 大于或小于。 【参考方案1】:

For 循环通常用于遍历数组,限制是数组的长度。由于数组是从零开始的,最后一个有效元素是length-1。所以选择是:

for (int i = 0; i < length; i++)

for (int i = 0; i <= length-1; i++)

第一个比较简单,所以首选。因此,即使限制不是数组大小,这种习惯用法也很常见。

我们不使用!=,因为有时我们会编写索引以可变步长递增的循环,有时它会跳过限制。所以使用&lt;比较更安全,这样就不会变成无限循环。

【讨论】:

你没有给i 一个类型,所以也许还值得指出的是,如果iunsigned,而length 为零,那么第二个循环将完全执行某些操作错了。【参考方案2】:

这通常是上下文语义的问题,便于“追随者”维护代码。

如果你需要 10 次迭代,这通常写成从 0 开始,并以 &lt;!= 为结束条件,因为这意味着 10 实际上是代码的一部分,因此显示很明显,打算进行 10 次迭代。非包含符号对于从零开始的数组(如 C 样式字符串)也更实用。通常不鼓励使用 != 表示法,因为如果索引器不仅仅是一个简单的增量、发生意外溢出等情况,它可能会导致无限循环。

另一方面,如果您需要一个往返于特定值的循环,那么如果您在代码中确实有结束条件,例如for(var i = 1; i &lt;= 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 循环都有完全相同的标题。这是一个有用的约定,有助于快速理解并减少错误。 (约定是&lt;,而不是&lt;=。不知道你从哪里得到的。)

在代码质量方面,执行相同操作的程序不一定相同。编码风格有一个客观的组成部分,它可以帮助人类处理任务的复杂性。

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

【讨论】:

以上是关于在 C 系列中,为啥在循环中“小于或等于”比“小于”符号更受欢迎? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

javascript (<) 中的小于运算符的工作方式小于或等于 [重复]

if 语句for循环

Python(matplotlib)文本中的小于或等于符号

在列表中查找小于或等于键的值

shell脚本if语句for循环语句

c_cpp 将所有元素小于或等于k所需的最小交换