如何在没有if-else的情况下无限循环或循环到极限

How to infinite loop or loop up to a limit without an if-else

本文关键字:无限循环 循环 极限 情况下 if-else      更新时间:2023-10-16

我想知道是否有一种方法可以编写一个函数,它只接受一个输入,即循环次数的最大计数,如果数字为负数,它将执行无限循环,而不使用if-else

void func(int nAttempts) // if nAttempts <= 0, do an infinite loop
{
  if ( nAttempts <= 0 )
  { // do an infinite loop
  }
  else
  { // do a loop up to nAttemtps
  }
}

我想知道是否有一种方法可以在没有if-else 的情况下做到这一点

while ((nAttempts < 0) || (nAttempts-- > 0)) {...}

但是。。。为什么?这会降低代码的可读性,因为if/else可以非常清楚地表明您的意图。

我认为这是一个技巧问题?这是我的看法:

void f(int n)
{
    n < 0 ? []{ while(true); }() : [&]{ while(n--); }() ;  
}

循环本身内部有一个条件,它不是一个显式if,但它是一个分支。由于懒惰的评估,该表达式的实际评估也变得完全。因此,这个问题有点荒谬,因为即使没有if语句,仍然存在条件语句。然而,你的问题的答案如下:

void optionalInfiniteLoop(int nAttempts){
    while(nAttempts < 0 || nAttempts-- != 0){
        ...
    }
}

看到这一点并理解懒惰评价,nAttempts<首先评估0。如果它是真的,则不需要运行||,因此它永远不会通过减去太远来包装int。如果为false,则while循环的第二部分进行求值,直到nAttempts变为0。我认为这样做不会节省任何东西,事实上,你可能会通过检查nAttempts<0,而不是只做一次。

在应用程序的上下文中,性能几乎肯定是无法衡量的,我认为上面的内容看起来更简洁,但它实际上更多的是一种风格方法,而不是技术方法。

void func( int nAttempts )
{
    while (nAttempts)
    {
        // do stuff
        --nAttempts;
    }
}

基本上,在每次迭代结束时,您减去一个"try"。当它到达0时,你停止。如果它一开始就已经是负的,那么它将变得越来越负(尽管我想它最终会溢出)。