【问题标题】:Does using "else if" eliminate the need for breaks after each condition in a while loop?使用“else if”是否消除了while循环中每个条件后的中断需要?
【发布时间】: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&lt;char, std::string&gt;std::map&lt;std::string, std::string&gt;s 键与str 字符串相关联。直接。
  • 在风格上,我更喜欢第一个。循环范围的中断看起来完全错误,因为它违背了循环的目的。另外:你需要测试std::cin以防出现错误(while (std::cin &gt;&gt; s)很好),如果你觉得你有太多的分支,预先建立一个std::map&lt;string, string&gt;作为查找表会让你摆脱这个混乱.此外,执行单行解析、返回布尔值作为成功标志的特定函数可能更具可读性。
  • @AlexandreC。循环范围内的break 旨在 '打败循环的目的'。语言特征就是它们的本质。不要发明额外的规则。
  • @EJP:我不明白你的意思。当我看到while 时,我希望break 语句是一个“特殊情况”,因此在一个条件内。这是一个品味问题,但是当您阅读代码时,您希望尽可能少地感到惊讶。
  • @Clifford 真正的代码稍微复杂一些,并且不测试单个字符。我试图使示例尽可能简单。我知道 switch 语句,但不确定何时在多个 if 中使用它们。另外,我会查看地图,它们似乎对我想做的事情非常有用。谢谢!

标签: c++ loops if-statement while-loop conditional


【解决方案1】:

是的,这会起作用。 else if 链确保只有else case continues 循环,而不是else case 触发break

【讨论】:

  • 一种风格比另一种更普遍吗?
  • @user5759490:我会发现单一的 breakcontinue 方法更易读,更不容易出错(无需检查每个案例中的 break/continue) .但是克利福德对这个问题的评论提供了更好的选择; switch 如果它们都是单个字符串,或者 std::map 用于查找,如果不是,都将更高效、更简单且更易于维护。
【解决方案2】:

是的,你可以。

提示:如果您想确定重构是否有效,您可以编写一个测试来检查代码是否正确。

【讨论】:

  • 那么应该在编译器/机器设置上运行测试。
【解决方案3】:

代码做同样的事情,关于执行时间没有区别,所以它们是相似的。不过,在第一个代码 sn-p 中,您不需要最后一个 break。但是,如果您考虑为您的案例设计一个好的样式,您应该考虑switch 声明。

while(true){
   char c;
   cin >>c;

   switch (c) {
     case 'A': 
        // deal with char A
        break;
     case 'b':
        // deal with char b
        break;
     default:
        continue;
   }
     break;
}

对于带有字符串的 switch 语句,您可以检查:Evaluate a string with a switch in C++

我发现 switch 语句更优雅。

【讨论】:

  • 但是它会无限循环,不是吗?
  • 糟糕,我在考虑第二个版本。我同意,它不应该被添加到第一个版本中。
  • 我是第一个:P
  • switch 语句不能用于检查字符串值。
  • 确实如此。我在考虑字符。那好吧。然而,这个例子向我们展示了如何使用字符串:stackoverflow.com/questions/16388510/…
猜你喜欢
  • 2015-04-07
  • 2014-06-26
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多