8

我刚开始使用 C++,但对其他语言有一些先验知识(不幸的是,vb 不久前),但有一个奇怪的困境。我不喜欢使用这么多 IF 语句,并想使用 switch/cases,因为它看起来更干净,我想参与实践.. 但是..

假设我有以下场景(理论代码):

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 循环,它需要两个 break 语句?

这显然看起来是错误的:

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

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

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

4

9 回答 9

32

我会将检查重构为另一个函数。

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));
}
于 2010-05-07T06:55:00.157 回答
13

您可以简单地让 while 循环检查在您的一个 case 语句中设置的 bool 值。

bool done = false;    
while(!done)
{
 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";
      done = true; // exit condition here
      break;
    case 'b':
      cout << "...";
      break;
  }
}
于 2010-05-07T04:56:04.343 回答
5

是的,C 和 C++ 没有办法说“退出多个可破坏块”(其中“可破坏块”是任何循环或开关)。变通方法包括gotos 和使用布尔变量来记录外部“可破坏块”是否也应该破坏(两者都不优雅,但这就是生活)。

于 2010-05-07T04:54:36.893 回答
5

两个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

}

于 2010-05-07T04:56:13.970 回答
3

你可以试试:

  • 使用标志
  • 使用转到
  • 将 Inner Breakable 块放入函数中
  • 使用异常
  • 使用 longjump 和 setjmp

一个与这个问题非常相似的话题

http://www.gamedev.net/community/forums/topic.asp?topic_id=385116

于 2010-05-07T05:09:35.733 回答
2

您可能对C++中的命名循环习惯用法感兴趣。

#define named(blockname) goto blockname; \
                         blockname##_skip: if (0) \
                         blockname:

#define break(blockname) goto blockname##_skip;

named(outer)
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(outer);
    case 'b':
      cout << "...";
      break(outer);
  }
}
于 2010-05-09T17:07:09.023 回答
1

您也可以将循环封装成一个函数并在 case 内部调用 return,以防标志破坏 while 不够用。对于某些人来说,这不是一个好的编程习惯,但如果你保持函数简单,我不明白为什么不这样做。

于 2010-05-07T04:59:13.997 回答
0

您可以将开关更改为 ifsystem。无论如何,它都会被编译成同样的东西。

于 2010-05-07T05:02:00.303 回答
0

您可以用稍微过度设计的 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);
}
于 2010-05-07T07:38:01.897 回答