我读过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)”相同,所以这个循环就像无限循环,我错了还是?任何帮助表示赞赏。
答案 0 :(得分:2)
是:
这个循环就像无限循环
你是正确的,因为while(true)
是一个永远循环的指令。
但是,还有一些其他方法可以退出循环:
return
语句将退出该函数(因此也会终止循环)break
语句将退出最近的for
,while
或switch
语句。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
。嗯,我们希望这不是本书的完整引用!