如何在不填充所有 cin 变量的情况下打破循环?

How to break a loop without fill all cin variables?

提问人:Mars 提问时间:9/8/2023 最后编辑:Remy LebeauMars 更新时间:9/8/2023 访问量:73

问:

如果有人进入终端,我需要一个声明来打破外部循环。但是,除非有人满足语句的所有变量,或者在新行中输入另一个字符,否则它不会中断。switchwhile'q'cin

我的代码目前如下:

#include <iostream>
#include <cmath>

int main () {
  bool run = true;
  while (run == true) {
 
    int a, b;
    char function;

    std::cout << "Enter the expression: ";
    std::cin >> function >> a >> b;

    if (function == 'q') {
      run = false;
      break;
    }
 
    switch (function) {
      case '+':
        std::cout << a << " + " << b << " = " << a + b << std::endl;
        break;

      case '-':
        std::cout << a << " - " << b << " = " << a - b << std::endl;
        break;

      case '*':
        std::cout << a << " * " << b << " = " << a * b << std::endl;
        break;

      case '/':
        std::cout << a << " / " << b << " = " << a / b << std::endl;
        break;

      default:
        std::cout << "That is not a valid operator!\n";
        break;
    }
  }
  return 0;
}

很遗憾,我不被允许使用 .goto

我有几种打破循环的方法。包括但不限于;使用 OR 作为循环条件,重新排列变量声明,并直接中断循环。intbool

c++ while循环

评论

2赞 john 9/8/2023
如果您想在仅阅读后采取一些行动,那么您要做的第一件事就是更改为 .functionstd::cin >> function >> a >> b;std::cin >> function;
0赞 user4581301 9/8/2023
不幸的是,我不被允许使用 goto。这并不是那么不幸。 正确使用可能会很麻烦,而且更难向审稿人证明您正确使用了它。另外,你将不得不重新解释为什么你曾经在项目的整个生命周期中几乎每个查看代码的程序员都该死。不使用 ,即使在极少数情况下,从长远来看,工作是正确的解决方案,也几乎总是花费更少的时间。gotogotogotogoto
0赞 user4581301 9/8/2023
当您遇到需要从嵌套循环或从 内部 的情况时,请考虑将问题代码移动到函数中并从该函数返回。breakswitch

答:

1赞 Ted Lyngmo 9/8/2023 #1

而不是

std::cin >> function >> a >> b;

if (function == 'q') {
    run = false;
    break;
}

您可以将提取从上到下拆分为不同的步骤cin

if (not(std::cin >> function) || // 1.
    function == 'q' ||           // 2.
    not(std::cin >> a >> b))     // 3.
{
    break;
}
  1. 检查 extracing to 是否失败。如果没有,请检查 2。function
  2. 检查提取到的内容是否是 .如果不是,请检查 3。functionq
  3. 检查两个操作数的提取是否失败。

如果满足任何条件,它将使逻辑 OR 链短路并退出循环,这意味着您可以通过键入 来退出循环。truebreakqReturn

1赞 463035818_is_not_an_ai 9/8/2023 #2

在验证输入的情况下,您可以简单地先检查,然后再继续其余的:functionfunction

 std::cin >> function;
 if (function == 'q') break;
 std::cin >> a >> b;

通常,从嵌套结构到的简单方法是 .例如,要从交换机内部跳出循环,您可以执行以下操作。而不是breakreturnwhile

int main() {
    // ...
    while(condition) {
        //...
        switch(function) {
             // ...
             default:
               break; // want to break out of the while

执行此操作:

void foo(char function, int a,int b) {
    while(condition) {
        //...
        switch(function) {
             // ...
             default:
               return; // breaks out of the while
        }
}

int main() {
    // ...
    foo(function,a,b);
}