c++ - C/C++ 中的无限循环

标签 c++ c loops infinite-loop

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

7年前关闭。




Improve this question




无限循环有几种可能,我会选择以下几种:

  • for(;;) {}
  • while(1) {}/while(true) {}
  • do {} while(1)/do {} while(true)

  • 是否有某种形式应该选择哪一种?现代编译器是否对中间语句和最后一条语句有所不同,或者它是否意识到这是一个无限循环并完全跳过检查部分?

    编辑:正如前面提到的,我忘记了 goto ,但这样做的原因是我根本不喜欢它作为命令。

    Edit2:我对从 kernel.org 获取的最新版本做了一些 grep。随着时间的推移,我似乎没有太大变化(至少在内核中)
    enter image description here

    最佳答案

    问这个问题的问题是你会得到很多主观的答案,只是简单地说明“我更喜欢这个……”。我将尝试用事实和引用而非个人意见来回答这个问题,而不是做出这种毫无意义的陈述。

    根据经验,我们可能可以从排除 do-while 替代方案(和 goto)开始,因为它们不常用。我不记得在由专业人士编写的实时生产代码中看到过它们。
    while(1) , while(true)for(;;)是实际代码中普遍存在的 3 个不同版本。它们当然是完全等效的,并产生相同的机器代码。

    for(;;)

  • 这是永恒循环的原始规范示例。在 Kernighan 和 Ritchie 的古老 C 圣经 The C Programming Language 中,我们可以读到:

    K&R 第二版 3.5:
    for (;;) {
    ...
    }
    

    is an "infinite" loop, presumably to be broken by other means, such as a break or return. Whether to use while or for is largely a matter of personal preference.



    很长一段时间(但不是永远),这本书被视为经典和 C 语言的定义。由于 K&R 决定展示 for(;;) 的示例,至少在 1990 年 C 标准化之前,这被认为是最正确的形式。

    但是,K&R 自己已经表示这是一个偏好问题。

    今天,K&R 是一个非常有问题的来源,用作规范的 C 引用。它不仅多次过时(不是针对 C99 或 C11),而且还宣扬了在现代 C 编程中通常被认为是坏的或公然危险的编程实践。

    但是,尽管 K&R 是一个有问题的来源,但这一历史方面似乎是支持 for(;;) 的最有力论据。 .
  • 反对for(;;)的论据loop 是它有点晦涩难懂。要了解代码的作用,您必须了解标准中的以下规则:

    ISO 9899:2011 6.8.5.3:
    for ( clause-1 ; expression-2 ; expression-3 ) statement
    

    /--/

    Both clause-1 and expression-3 can be omitted. An omitted expression-2 is replaced by a nonzero constant.



    根据标准中的这段文字,我认为大多数人会同意它不仅晦涩难懂,而且很微妙,因为 for 循环的第 1 部分和第 3 部分在省略时的处理方式与第 2 部分不同。


  • while(1)
  • 这应该是比 for(;;) 更易读的形式.然而,它依赖于另一个晦涩但众所周知的规则,即 C 将所有非零表达式视为 bool 逻辑真。每个 C 程序员都知道这一点,所以这不是什么大问题。
  • 这种形式存在一个大的实际问题,即编译器倾向于为它发出警告:“条件总是为真”或类似的。这是一个很好的警告,您真的不想禁用它,因为它对于查找各种错误很有用。例如,诸如 while(i = 1) 之类的错误,当程序员打算写while(i == 1) .

    此外,外部静态代码分析器可能会提示“条件始终为真”。


  • while(true)
  • 使while(1)更具可读性,有些使用 while(true)相反。程序员之间的共识似乎是这是最易读的形式。
  • 但是,这个表单和while(1)有同样的问题。 ,如上所述:“条件始终为真”警告。
  • 对于C,这种形式还有一个缺点,即它使用宏true。来自 stdbool.h。所以为了进行这个编译,我们需要包含一个头文件,这可能不方便。在 C++ 中,这不是问题,因为 bool作为原始数据类型存在并且 true是语言关键字。
  • 这种形式的另一个缺点是它使用 C99 bool 类型,该类型仅在现代编译器上可用且不向后兼容。同样,这只是 C 中的问题,而不是 C++ 中的问题。


  • 那么使用哪种形式呢?两者似乎都不完美。正如 K&R 在黑暗时代已经说过的那样,这是个人喜好的问题。

    就个人而言,我总是使用 for(;;)只是为了避免其他形式经常生成的编译器/分析器警告。但也许更重要的原因是:

    如果连 C 初学者都知道 for(;;)意味着一个永恒的循环,那么你想让谁的代码更具可读性?

    我想这就是它真正归结起来的原因。如果您发现自己试图让您的源代码对那些甚至不了解编程语言的基本部分的非程序员可读,那么您只是在浪费时间。他们不应该阅读您的代码。

    因为每个应该阅读您的代码的人都已经知道 for(;;)意味着,让它进一步可读是没有意义的——它已经是可读的了。

    关于c++ - C/C++ 中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20186809/

    相关文章:

    c++ - 转换之间的数据丢失

    用于模拟应用程序的 C++ normal_distribution 函数

    c++ - MMX 与 SSE2 性能比较

    c - malloc分配的大小如何取决于RAM?

    c - 将字符串元素复制到另一个字符串时出现段错误

    c - 使字符串比较函数更简短

    javascript - 在 For 循环中定时打开不同页面

    C++ Eigen - 如何结合广播和元素操作

    c - 在此 pnpoly 算法中包括边

    javascript - 我可以在 Javascript 的 forEach 中使用另一个循环吗?还是我最好用它来分隔循环?