【问题标题】:Is there anything wrong with using an empty for loop?使用空的 for 循环有什么问题吗?
【发布时间】:2011-08-17 14:14:18
【问题描述】:

距离我上次编程已经有一段时间了,我似乎忘记了使用空的“for循环”来创建无限循环是否可以接受?

for(;;)

目前我在一个程序中使用这种方法,让它反复要求用户输入两个数值,一个用于程序中的每个双变量。然后程序调用一个函数并计算这两对数字的总和。

要终止程序,我有“if”语句来检查用户输入值是否为零,如果值为零,则程序使用“返回 0”终止;论据。

程序在将值分配给变量后立即检查每个用户输入的值是否为零。


所以对于真正的问题:这是使我的程序按照我描述的方式执行的正确方法吗?还是有更多/更好/被接受的编程方式?

其次,像我在这个程序中那样使用“返回 0”参数有什么问题吗?

如果你觉得我要写的或想表达的意思很难理解,请回复,我会花更多时间来写。

【问题讨论】:

  • 可以说有更优雅的方式(do-while),但你的方式肯定没有错。
  • 仅供参考,这是一个无限循环,而不是一个空循环。一个空的 for 循环看起来像这样 for (initialisation;condition;updation);for (initialisation;condition;updation){}

标签: c++ for-loop if-statement return termination


【解决方案1】:

您正在做的事情非常好,并且是编写和退出无限循环的惯用方式。

【讨论】:

    【解决方案2】:

    我总是使用while(true) 进行无限循环

    【讨论】:

      【解决方案3】:

      我在几个地方看到过这个:

      #define forever for(;;)
      
      forever {
      
      }
      

      我不确定我会推荐它。

      【讨论】:

      • 这只是意味着你必须去查找定义:)
      • @hammar 这不是永远的,假设您使用了breakgoto
      【解决方案4】:

      for(;;)while(1) 都可以接受。这些只是语言提供的条件循环,您可以根据您的要求使用它们来进行无限运行循环。

      【讨论】:

        【解决方案5】:

        这是有效的,您可以继续使用您的代码。

        【讨论】:

        • @ildjarn:“大多数平台”是 MSVC,还是基于 EDG 的编译器也会对此发出警告?
        • @ildjarn:GCC 从来没有警告过我使用while(true)
        • @ildjarn:我认为不应该,因为我认为在条件中使用常量表达式没有任何问题。我认为 MSVC 在循环继续中警告 true 是非常随意的,但对于空循环继续条件则没有。尤其是在 C++ 中,因为该常量表达式可能是一些相当令人兴奋的模板元程序的结果。如果编译器非常弱,以至于当您在 if 中执行它时它不会忽略死代码,那么警告可能是合理的,但我们知道 MSVC 不是那么弱,对我来说,警告只是强制一种风格。
        • @Gaurav:这仅略逊于while(true)(因为读者必须查看循环体以查看其中是否修改了flag),但足以让我更喜欢for(;;) 作为避免警告的一种手段。
        • @ildjarn - 警告的问题是“常量”条件可以为一个模板实例选择 if 部分,而为另一个模板实例选择 else 部分。这是一个错误吗?这使它成为我禁用的"silly warnings" 之一(然后我也可以随意使用while(true))。
        【解决方案6】:

        是的,这是完全可以接受的。一旦在循环中有退出条件(breakreturn),您就可以在循环语句中使循环“无限”——您只需将退出条件从循环语句移到循环体中。如果这使程序更具可读性,您当然可以这样做。

        【讨论】:

          【解决方案7】:

          对于无限循环for (;;) 是相当普遍的做法。但是,如果您确实有条件,例如非零用户输入,您总是可以在 while 循环中完成该检查。

          【讨论】:

            【解决方案8】:

            您还可以使用带条件的 while 循环重复请求用户输入。

            while (condition) {
              ...
            }
            

            您可以使用 .

            代替 IF 块进行验证

            【讨论】:

              【解决方案9】:

              您所描述的内容可以正常工作,但值得一提的是,某些严格的编码标准(即MISRA)不赞成在函数结束前使用return

              如果您的代码符合此类标准,那么您可以使用 do-while 循环和适当的退出条件:

              do {
                 // get userinput
                 if (userinput != '0')
                 {
                     // do stuff 
                 }
              } while (userinput != '0');
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-04-23
                • 1970-01-01
                • 1970-01-01
                • 2016-05-05
                • 1970-01-01
                相关资源
                最近更新 更多