【发布时间】:2016-07-12 16:35:54
【问题描述】:
使用“else if”是否消除了在 while 循环中每个条件之后的中断需要?当输入正确的输入之一时,我想退出循环。
我的代码的第一个版本是这样的
string s;
string str;
while (true) {
cin >> s;
if (s == "a") {
str = "Apple";
break;
}
if (s == "b") {
str = "Banana";
break;
}
... more ifs ...
else {
cout << "Did not recognize input." << endl;
continue;
}
}
我可以将其更改为下面的代码而不会产生负面影响吗?它对我来说更短更漂亮。
string s;
string str;
while (true) {
cin >> s;
if (s == "a") str = "Apple";
else if (s == "b") str = "Banana";
else if (s == "c") str = "Cat";
... more else-ifs ...
else {
cout << "Did not recognize input." << endl;
continue;
}
break;
}
【问题讨论】:
-
如果所有条件都针对单个字符串测试
s,那么使用switch(s[0])会更简单、更易于维护和更高效 - 或将s设为char和然后switch(s)。更简单的可能是使用std::map<char, std::string>或std::map<std::string, std::string>将s键与str字符串相关联。直接。 -
在风格上,我更喜欢第一个。循环范围的中断看起来完全错误,因为它违背了循环的目的。另外:你需要测试
std::cin以防出现错误(while (std::cin >> s)很好),如果你觉得你有太多的分支,预先建立一个std::map<string, string>作为查找表会让你摆脱这个混乱.此外,执行单行解析、返回布尔值作为成功标志的特定函数可能更具可读性。 -
@AlexandreC。循环范围内的
break旨在 '打败循环的目的'。语言特征就是它们的本质。不要发明额外的规则。 -
@EJP:我不明白你的意思。当我看到
while时,我希望break语句是一个“特殊情况”,因此在一个条件内。这是一个品味问题,但是当您阅读代码时,您希望尽可能少地感到惊讶。 -
@Clifford 真正的代码稍微复杂一些,并且不测试单个字符。我试图使示例尽可能简单。我知道 switch 语句,但不确定何时在多个 if 中使用它们。另外,我会查看地图,它们似乎对我想做的事情非常有用。谢谢!
标签: c++ loops if-statement while-loop conditional