我刚开始使用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循环,它需要两个break语句?
这显然是错误的:
case 'a':
cout << "You entered A, which is correct";
break;
break;
所以我只能对'a'做一个IF语句来使用break ;?我错过了一些非常简单的东西吗?
这将解决我现在遇到的很多问题。
答案 0 :(得分: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));
}
答案 1 :(得分: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;
}
}
答案 2 :(得分:5)
是的,C和C ++没有办法说“退出多个可破坏的块”(其中“可破坏的块”是任何循环或开关)。解决方法包括goto
和使用布尔变量来记录外部“易碎区块”是否也应该破坏(既不优雅,但也就是生命)。
答案 3 :(得分:5)
两个break
语句不会让你退出while循环。第一个break
只能让您退出switch
语句,而第二个永远不会到达。
你需要的是使while循环的条件为false,假设在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
}
答案 4 :(得分:3)
你可以尝试:
与此问题非常相似的主题
http://www.gamedev.net/community/forums/topic.asp?topic_id=385116
答案 5 :(得分:1)
你也可以将循环封装到一个函数中并在case中调用return,以防止破坏while的标志是不够的。 对于某些人来说,这不是一个好的编程习惯,但如果你保持这个功能简单,我不明白为什么不这样做。
答案 6 :(得分:1)
您可能对C ++中的named loop idiom感兴趣。
#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);
}
}
答案 7 :(得分:0)
您可以将切换更改为ifsystem。无论如何它将被编译成相同的东西。
答案 8 :(得分: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);
}