使用空的 for 循环有啥问题吗?
Posted
技术标签:
【中文标题】使用空的 for 循环有啥问题吗?【英文标题】: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)
【参考方案1】:
您正在做的事情非常好,并且是编写和退出无限循环的惯用方式。
【讨论】:
【参考方案2】:我总是使用while(true)
进行无限循环
【讨论】:
【参考方案3】:我在几个地方看到过这个:
#define forever for(;;)
forever
我不确定我会推荐它。
【讨论】:
这只是意味着你必须去查找定义:) @hammar 这不是永远的,假设您使用了break
或goto
。【参考方案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】:
是的,这是完全可以接受的。一旦在循环中有退出条件(break
或 return
),您就可以在循环语句中使循环“无限”——您只需将退出条件从循环语句移到循环体中。如果这使程序更具可读性,您当然可以这样做。
【讨论】:
【参考方案7】:对于无限循环for (;;)
是相当普遍的做法。但是,如果您确实有条件,例如非零用户输入,您总是可以在 while
循环中完成该检查。
【讨论】:
【参考方案8】:您还可以使用带条件的 while 循环重复请求用户输入。
while (condition)
...
您可以使用 .
代替 IF 块进行验证【讨论】:
【参考方案9】:您所描述的内容可以正常工作,但值得一提的是,某些严格的编码标准(即MISRA)不赞成在函数结束前使用return
。
如果您的代码符合此类标准,那么您可以使用 do-while
循环和适当的退出条件:
do
// get userinput
if (userinput != '0')
// do stuff
while (userinput != '0');
【讨论】:
以上是关于使用空的 for 循环有啥问题吗?的主要内容,如果未能解决你的问题,请参考以下文章