【问题标题】:C/C++ for loop with existing start value具有现有起始值的 C/C++ for 循环
【发布时间】:2013-05-27 23:15:27
【问题描述】:

这是一个 C/C++ for 循环:

int i;
for (i = myVar; i != someCondition(); i++)
  doSomething();
// i is now myVar plus the number of iterations until someCondition

我最近不得不使用这样的循环。我需要保留i 的值,因为当someCondition() 的返回值变为真时,我想知道i 是什么。而i 的起始值为myVar,没有进一步存在的理由。那么想要做的是:

for (myVar; myVar != someCondition(); myVar++)
  doSomething();
// myVar is now myVar + the number of iterations.

这对我来说更有意义。当myVar 正是我需要的时候,我不明白为什么我必须使用一个全新的变量。但这不是有效的代码。有没有办法为这种情况创建一个全新的变量?

【问题讨论】:

  • for (init;condition;step)init 部分留空:for( ; condition ; step)。 (当然这假设 myVar 在循环之前的某个位置声明。)

标签: c++ c variables for-loop


【解决方案1】:

我觉得while 循环更接近您的意图。事实上,你正在做的事情whilesomeCondition()true,增加myVar 是一个副作用。

while(myvar != someCondition()) {
 doSomething();
 myVar++;
}

需要明确:这些陈述是等价的。我只是在提倡我认为更惯用的代码。

您甚至可以使用do/while 循环,但我觉得它有点不习惯。您将在下面找到三个示例;他们都做同样的事情,但感觉不同。任君挑选!

#include<iostream>

int someCondition() {
  return 10;
}

void doSomething(int myVar) {
  std::cout<<"... I'm doing something with myVar = "<<myVar<<std::endl;
}

int using_for() {
  int myVar = 7;
  for( ; myVar!=someCondition(); myVar++) {
    doSomething(myVar);
  }
  return myVar;
}

int using_while() {
  int myVar = 7;
  while(myVar != someCondition()) {
    doSomething(myVar);
    myVar++;
  }
  return myVar;
}

int using_do() {
  int myVar = 7;
  do {
    doSomething(myVar);
  } while(++myVar != someCondition());
  return myVar;

}

int main() {
  std::cout<<"using for: "<<using_for()<<std::endl;
  std::cout<<"using while: "<<using_while()<<std::endl;
  std::cout<<"using do/while: "<<using_do()<<std::endl;

}

输出:

... I'm doing something with myVar = 7
... I'm doing something with myVar = 8
... I'm doing something with myVar = 9
using for: 10
... I'm doing something with myVar = 7
... I'm doing something with myVar = 8
... I'm doing something with myVar = 9
using while: 10
... I'm doing something with myVar = 7
... I'm doing something with myVar = 8
... I'm doing something with myVar = 9
using do/while: 10

【讨论】:

    【解决方案2】:

    你需要的是,

    for( ; myVar != someCondition(); myVar++)
           doSomething();
    

    但是你关于以下循环不正确的说法是错误的,

    for (myVar; myVar != someCondition(); myVar++)
      doSomething();
    

    上面的代码在 C 中也可以正常工作。

    【讨论】:

    • 但是可能会有关于没有副作用的表达式的警告。
    • 尝试用-Wunused-value编译
    • 同意:)。我试图指出的是,该语句不会像 OP 提到的那样给出编译错误。
    • 是的,我同意,这是合法的,不会有错误,只是一个警告。除非 OP 使用-Werror,否则警告将像错误一样停止编译。
    【解决方案3】:

    我想这就是你所追求的:

    for ( ; myVar != someCondition(); myVar++)
        doSomething();
    

    【讨论】:

      猜你喜欢
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多