c++ - for循环return - while循环中的高级switch语句?




js for循环return (6)

两个break语句不会让你离开while循环。 第一次break只会让你脱离switch语句,第二次是永远不会到达。

你需要的是使while循环的条件为假,假设在switch语句之后的循环中没有任何东西。 如果交换机之后还有其他代码,则应该检查switch ,并在那里break


bool done = false;

while(! done)
{
  // do stuff
  switch(something)
  {
    case 'a':
    done = true;  // exit the loop 
    break;
  }

  //  do this if you have other code besides the switch
  if(done)
   break;  // gets you out of the while loop

  // do whatever needs to be done after the switch

}

我刚刚开始使用C ++,但对其他语言有一些先前的知识(不幸的是,一段时间后面),但有一个奇怪的困境。 我不喜欢使用这么多的IF语句,并希望使用开关/案例,因为它看起来更清洁,我想进入实践..但..

比方说,我有以下情况(理论代码):

while(1) {

  //Loop can be conditional or 1, I use it alot, for example in my game
  char something;
  std::cout << "Enter something\n -->";
  std::cin  >> something;

  //Switch to read "something"
  switch(something) {
    case 'a':
      cout << "You entered A, which is correct";
      break;
    case 'b':
      cout << "...";
      break;
  }
}

这是我的问题。 比方说,我想退出WHILE循环,它需要两个断言?

这显然看起来不正确:

case 'a':
  cout << "You entered A, which is correct";
  break;
  break;

那么我只能在'a'上做IF语句来使用break吗? 我错过了一些非常简单的事情吗

这将解决我现在的很多问题。


你也可以把这个循环封装成一个函数,然后在这个case里面调用return,这个标志打破了这个情况是不够的。 对某些人来说这不是一个好的编程习惯,但是如果你保持这个功能简单,我不明白为什么不这样做。


你可以改变你的系统。 无论如何,它将被编译成相同的东西。


您可以用稍微过度设计的OO解决方案替换交换机...

#include <iostream>
#include <map>
#include <set>

class input_responder
{
    std::set<char> correct_inputs;
    std::map<char, const char*> wrong_inputs;

public:

    input_responder()
    {
        correct_inputs.insert('a');
        wrong_inputs['b'] = "...";
    }

    bool respond(char input) const
    {
        if (correct_inputs.find(input) != correct_inputs.end())
        {
            std::cout << "You entered " << input << ", which is correct\n";
            return true;
        }
        else
        {
            std::map<char, const char*>::const_iterator it = wrong_inputs.find(input);
            if (it != wrong_inputs.end())
            {
                std::cout << it->second << '\n';
            }
            else
            {
                std::cout << "You entered " << input << ", which is wrong\n";
            }
            return false;
        }
    }
};

int main()
{
    const input_responder responder;
    char input;
    do
    {
        std::cout << "Enter something\n -->";
        std::cin  >> input;
    } while (responder.respond(input) == false);
}

我会重新检查到另一个功能。

bool is_correct_answer(char input)
{
    switch(input)
    {
    case 'a':
        cout << "You entered A, which is correct";
        return true;
    case 'b':
        cout << "...";
        return false;
    }
    return false;
}

int main()
{
    char input;
    do
    {
        std::cout << "Enter something\n -->";
        std::cin  >> input;
    } while (!is_correct_answer(input));
}

是的,C和C ++没有办法说“退出多个易碎块”(其中“易碎块”是任何循环或开关)。 解决方法包括goto和使用布尔变量来记录外部“易碎块”是否也应该打破(既不优雅,但是,这是生活)。







break