在C编程中使用无限循环是否值得推荐/明显

时间:2015-10-06 05:22:13

标签: c loops

这是一个例子。对于可以使用的小程序,但是如果我们正在开发实时项目或应用程序会怎样。需要一些建议

while (TRUE )
{
    int temp =0 ;
    printf ( "How many no's would you like to enter : " ) ;
    temp = scanf ( "%d" , &n )  ;
    if ( temp==1 )
        break ;
    else
    {
        printf ("Invalid input. Try again. \n" ) ;
        fflush ( stdin ) ;
    }
}

2 个答案:

答案 0 :(得分:0)

如果你问的是风格,建议会有点主观。

如果你担心你的循环可能在不受欢迎时变成真正的无限循环,那么你需要对此做些什么。例如:

  • 重新设计您的代码,使其成为一个显式的状态机,具有明确记录和实施的状态,以便状态发生变化时保持不变
  • 考虑可能发生的各种错误情况(因此可能导致无限期地悬挂在特定状态)并尽可能地处理它们,还要考虑那些致命且无法优雅处理的条件(你是否做过)崩溃和烧伤?你是否记录错误?你在某个仪表板上显示它吗?你是否用驱动程序弹出驾驶员座位?如果适用,你是否拨打紧急电话号码等等),将其纳入状态机< / LI>
  • 与同行一起审查代码(甚至可能聘请行业专家)
  • 实施和使用测试(单元/集成/基于场景/可扩展性/压力/安全性等等)

答案 1 :(得分:0)

任何循环的麻烦,无论是while(TRUE)还是while(condition),都是他们倾向于有一个潜行的无限循环条件 - 就像这个一样。

OP的代码取决于scanf("%d",...1not 1的2个结果。

如果用户输入"123",一切都很好。 scanf()返回1,循环退出,我们都离开了工作并且有一品脱。

如果用户输入"abc"scanf()返回0,则代码执行fflush(stdin)以清空stdin。 (这真的是UB,但让我们假装它有效。)代码循环,再次提示,我们的饮料变暖,但希望我们最终会输入数字。

但是让我们想象一下用户关闭stdin - 也许代码重定向输入,scanf()最终返回EOF。代码循环,但fflush(stdin)不会重新打开stdin,而scanf()会再次返回EOF - 并且一次又一次 - 真正的无限循环 - 代码不会暂停输入,只是说“”输入无效。再试一次。“这意味着”愚蠢的家伙,愚蠢的家伙,愚蠢的家伙......“看起来工作人员将在没有我们的情况下开始酿造。

  

故事的道德:当代码按预期工作时循环(用户输入了良好的数据)。当函数循环出现意外时,请注意循环。