2

我有类似的东西

   while(playAgain==true)
   {
      cout<<"new game"<<endl; //i know 'using namespace std;' is looked down upon
      while(playerCard!=21)
      {
          *statements*
          if(decision=='n')
          {
              break
          }
       ...
      }
   }

但是当我想跳出两个循环时,这个 break 只会跳出第一个 while 循环

4

6 回答 6

8

不要煮意大利面并将循环提取到函数中:

void foo(...) {
    while (...) {
        /* some code... */
        while (...) {
            if ( /* this loop should stop */ )
                break;
            if ( /* both loops should stop */ )
                return;
        }
        /* more code... */
    }
}

这种分解也会产生更简洁的代码,因为您将拥有不同抽象级别的简洁函数,而不是数百行丑陋的程序代码。

于 2013-09-07T05:24:40.803 回答
2

基本上有两种选择。

  1. 在外循环中添加条件检查。

    while ((playAgain==true) && (decision != '\n'))

  2. 只需使用goto. 人们经常被告知永远不要goto像怪物一样使用它。但我不反对用它来退出多个循环。在这种情况下它是干净和清晰的。

于 2013-09-07T05:26:40.890 回答
1

使用转到:

   while(playAgain==true)
   {
      cout<<"new game"<<endl; //i know 'using namespace std;' is looked down upon
      while(playerCard!=21)
      {
          *statements*
          if(decision=='n')
          {
              goto label;
          }
       ...
      }
   }
   label: 
   ...    
于 2013-09-07T05:27:22.613 回答
1
 while(playAgain==true && decision !='n' ){
                           ^^ add a condition
      cout<<"new game"<<endl; 
      while(playerCard!=21){
      *statements*
      if(decision=='n'){
          break
         }
     ...
      }
 }
于 2013-09-07T05:26:05.257 回答
0

如果你不必避免goto声明,你可以写

while (a) {
    while (b) {
        if (c) {
            goto LABEL;
        }
    }
}
LABEL:
于 2013-09-07T05:30:57.367 回答
0

此解决方案特定于您的情况。当用户的决定是'n'时,他不想再玩了。所以只需设置playAgain然后false休息。外环会自动断开。

while(playAgain==true){
   cout<<"new game"<<endl; //i know 'using namespace std;' is looked down upon
   while(playerCard!=21){
      *statements*
      if(decision=='n'){
         playAgain = false; // Set this to false, your outer loop will break automatically
         break;
      }
   }
}
于 2013-09-07T05:26:50.047 回答