这个循环有什么更好的实现?

时间:2012-10-25 17:31:18

标签: c++ for-loop

我需要实现一个循环,我必须询问用户,然后检查输入的有效性(在这种情况下,有必要打印这是一个无效的数字)。实施它的更好方法是什么?

我们的编程教授不允许我们使用breakfor(;;),因为他说,这是一种不好的做法。这是对的吗?

示例1:

int i = 0;

while(i == 0) {
  cout << "...: ";
  cin >> i;

  /*... Loop body ...*/

  if (i == 0)
    cout << "Not a valid number" << endl;
}

示例2:

int i = 0;

do {
  cout << "...: ";
  cin >> i;

  /*... Loop body ...*/

  if (i == 0)
    cout << "Not a valid number" << endl;

} while (i == 0) // Better while(true) and use break ?

示例3:

int i = 0;

for ( ;; ) {
  cout << "...: ";
  cin >> i;

  /*... Loop body ...*/

  if (i == 0)
    cout << "Not a valid number" << endl;
  else
    break;
}

4 个答案:

答案 0 :(得分:2)

在你的情况下,第二个构造(do..while)是读者最容易看到的代码所做的事情,这很重要。

第一个不是那么糟糕,最后一个是差的,“for”构造通常用于预先设置限制的有限次数的迭代。它不一定是,但直观地说就是如何使用for循环。

(顺便说一下,如果用户输入的字符串不是数字,则必须清除cin上的失败标志,但这不是真正的问题。)

答案 1 :(得分:2)

你不需要接受零作为整数吗?最好不要依赖具有特殊含义的输入数字。

如果循环的意义是无限循环,直到任务完成,那么清楚地说while(true)并没有错。我可能会做更像这样的事情(需要C ++ 11):(或使用boost lexical_cast)

#include <iostream>
#include <string>
#include <stdexcept>

int infini_asker(){
  while (true) {
    std::cout << "...: ";
    std::string tmp;
    std::cin >> tmp;
    int i;
    try{
      i=std::stoi(tmp);
    }catch(std::invalid_argument){
      continue;
    }catch(std::out_of_range){
      continue;
    }
    return i;
  } 
}

int main(){
  int num=infini_asker();
  std::cout << " got:" <<num << std::endl;
}

答案 2 :(得分:1)

示例1的修改看起来是最好的形式:

while(true) {
    cout << "...: ";
    cin >> i;

    /*... other stuff ...*/

    // Do your input validation here:
    // Note that it's much better to whitelist what is
    // acceptable input as opposed to checking all of the
    // possible cases of invalid input
    if (...) { // where .. is the condition for valid input
        break
    } 
}

应该为特殊情况保留do-while循环,在这种情况下,您希望得到嵌套逻辑至少执行一次的要点。你可以用do-while做任何事情,你可以用while(...)

for(;;)对于很多程序员来说是不太熟悉的语法(我不知道一年前的含义),而while(true)更明显。

答案 3 :(得分:0)

他们都工作。像Shmiddty说的那样for(;;)不是一个好的编程习惯。我会像例子2那样做,但我不是一个专业的程序员。