关于循环中的布尔标识符我认为

时间:2014-04-09 06:54:54

标签: c++ while-loop infinite-loop

我读过Mark Lee,C ++绝对初学者的书,其中一个代码片段是:

while(true)
{
    cout << description.c_str() << "\n\n";
    int response = 0;
    do
    {
        cout << "What would you like to do?\n";
        if(enemy)
        cout << "1) Attack the evil "
             << enemyName.c_str() << "\n";
        else if(!enemy)
        cout << " 1) Move to the next room.";
        if(treasure)
        cout << " 2) Pick up the "
             << treasureName.c_str() << "\n";
        cin  >> response;
    }while(response < 1 || response > 2);

    switch(response)
    {
        case 1 :  if(enemy)
                  {
                    enemy = !enemy;
                    cout << "You slay the deadly "
                         << enemyName.c_str() << "\n";
                  }
                  else if(!enemy)
                    return;
                  break;
        case 2:   treasure = !treasure;
                  cout << "You pick up the "
                       << treasureName.c_str() << "\n";
                  break;
    }
}

我认为你可以忽略这个程序的意图,但问题是,为什么“while(true)”的部分存在?我想,没有办法摆脱循环,对吧?因为,我认为“true”值总是返回1,而“while(true)”部分与“while(true == 1)”相同,所以这个循环就像无限循环,我错了还是?任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:2)

是:

  

这个循环就像无限循环

你是正确的,因为while(true)是一个永远循环的指令。

但是,还有一些其他方法可以退出循环:

  • return语句将退出该函数(因此也会终止循环)
  • break语句将退出最近的forwhileswitch语句。
  • goto语句可能会导致代码跳转到循环外的标签
  • exit()调用将导致整个程序终止。
  • throw语句将抛出一个异常,该异常将分解为最接近的catch语句(可能在循环之外)。

在这种情况下,循环底部附近的return;会导致函数退出。

break;语句不会导致循环停止,因为它们属于switch


关于使用goto的一个警告 - 许多程序员认为它风格很差,因为它可能导致代码难以理解。关于this question还有很多进一步的讨论。在C ++中,throw通常更适合可能使用goto的情况。


但是,在纯C中存在goto非常有用的情况。 This answer可以很好地概述goto在历史上被认为是穷人风格的原因,甚至提供了一些使用goto可能适合的示例。

当然,初学者的一个好规则可能是“假装goto不存在”。特别是在C ++中。

答案 1 :(得分:2)

仔细观察,有一个

return;
代码中的

语句。这将退出循环和循环所在的函数。

答案 2 :(得分:1)

(这是值得回答的,因为它欺骗了至少一个5,000名声誉用户,因此证明了编写清晰代码的重要性。)

return语句是循环终止符。这将退出该功能。

它深埋在这个功能中。因此,我批评了代码的风格:它难以理解并且很难调试。

答案 3 :(得分:0)

while(true){...}的唯一退出是return语句,它终止了周围的函数。

我不知道这本书,但我从来没有看到过另一种写作的建议,如果这种陈述是多余的话:

if(enemy)
{ ...
}
else if(!enemy)
{...
}

通常应避免冗余,因为它会使维护变得更加困难。

我非常不喜欢:

    case 2:   treasure = !treasure;
              cout << "You pick up the "
                   << treasureName.c_str() << "\n";

这将让你拿起宝藏,但你留在循环中,可以选择&#39; 2&#39;再一次,告诉你&#34;你拿起x&#34;再次,但再次否定变量treasure。嗯,我们希望这不是本书的完整引用!