C++ C++;更改for循环的条件求值

C++ C++;更改for循环的条件求值,c++,C++,我有一个for循环,其中start、stop和step是用户传入的参数: for (double i(start); i <= stop; i += step) 是否有办法在同一for循环中支持这两种方法(通过检查start是>还是=或请详细说明您的情况,因为最好为这两个循环分别编写两个循环 if(start < stop){ for (double i(start); i <= stop; i += step){} } else{ for (double i

我有一个for循环,其中start、stop和step是用户传入的参数:

for (double i(start); i <= stop; i += step)

是否有办法在同一for循环中支持这两种方法(通过检查start是>还是=或请详细说明您的情况,因为最好为这两个循环分别编写两个循环

if(start < stop){
    for (double i(start); i <= stop; i += step){}
}
else{
    for (double i(start); i >= stop; i -= step){}
}
if(启动<停止){
对于(双i(开始);i=停止;i-=步骤){}
}

请坚持使用整数作为计数器。

您可以执行以下操作

  double ss = std::copysign(1.0, step);
  for (double x = start; x*ss <= stop*ss; x += step)
  {
      //loop body
  }
double ss=std::copysign(1.0,步骤);

对于(double x=start;x*ss您可以将步数的计算与实际步数分开:

// compute how many steps
int stepCount = (stop - start) / step + 1;

// iterate over that many steps
for (int i = 0; i < stepCount; i++)
{
    double value = start + step * i;
    // use value here
}
//计算步骤数
int步数=(停止-启动)/步数+1;
//重复那么多步骤
对于(int i=0;i

对我来说,这是最清晰、最简单的理解。

你可以使用三元运算符:

for(双i(开始);start>stop?i>=stop:i stop
但是
步骤是肯定的,您也可以使用

for(双i(开始);开始>停止?i>=停止:我停止?i-=步骤:i+=步骤)
但是请注意,不建议使用三元运算符,因为它可能会混淆代码的任何读取器。

只使用两个for循环和一个if语句可能更(时间)高效,因为这将在循环执行之前进行一次比较,而不是在循环的每次迭代中进行一次或两次比较。

如何区分这两种情况?然后可以编写两个循环,就这么简单。从代码中(首先让它工作),您可以尝试简化它。@cigien我已经检查过,如果开始>停止,步骤必须是负的。因此,没有无限循环和I+=步骤仍然有效。您可以添加该代码吗?我怀疑您正在尝试简化一段代码,而简化可能应该在其他地方进行。@UlrichEckhardt是的,我可以让它工作有两个独立的循环,但我试图避免这样做,所以我不需要重构现有的代码使用std::min初始化I和std::max初始化循环结束条件。计算不太正确。原始循环在
start时执行一次它似乎也不正确,当stop略小于start时,您将有一个步骤,sh应该有0。如果你使用浮点值,你就放弃了关注“轻微”的权利。0.6到1.2,0.3步,永远是“不精确的”。这违反了DRY原则
// compute how many steps
int stepCount = (stop - start) / step + 1;

// iterate over that many steps
for (int i = 0; i < stepCount; i++)
{
    double value = start + step * i;
    // use value here
}