为什么这样做/永远不会结束?

时间:2013-08-15 06:47:36

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

它只是保持循环。数字继续减少,直到该计划结束。我滥用了什么吗?

playerHealth和orcHealth ints为100。

randomNumber = ("%10d", 1 + (rand() % 100));

这是我在srand()解释页面上看到的随机数的方式。如果这是错的,应该怎么做?

这里还有其他问题吗?

    switch(charDecision)
{
case 1:
    cout << "FIGHT" << endl;
    do{
        randomNumber = ("%10d", 1 + (rand() % 100));
        if(randomNumber >= 50){
            orcHealth = orcHealth - (randomNumber - (randomNumber / 5));
        cout << "You hit the orc! He now has " << orcHealth << " life left!" << endl;
        }
        else
        {
            playerHealth = playerHealth - (randomNumber - (randomNumber / 5));
            cout << "The orc hit you! You now have " << playerHealth << " life left!" << endl;
        }
    }while(playerHealth || orcHealth >= 0);
    break;

default:
    break;
}

3 个答案:

答案 0 :(得分:18)

playerHealth || orcHealth >= 0 意味着“当玩家健康大于零或者orchealth大于零时”。这意味着“当玩家健康时,施放到布尔值是真或者OR orchealth大于零”。

答案 1 :(得分:9)

这个

}while(playerHealth || orcHealth >= 0);

应该是

}while(playerHealth > 0 && orcHealth > 0);

我想你想退出循环,如果其中一个是0或更少。

另外,将randomNumber = ("%10d", 1 + (rand() % 100));更改为randomNumber = 1 + rand() % 100; 逗号运算符只是模糊代码。

答案 2 :(得分:3)

do...while语句的条件将在某个时刻停止,但仅在某个时刻停止。这意味着,如果playerHealth为零或orcHealth小于零,则会满足您的条件。如果playerHealth低于零怎么办?这很可能是因为你总是从两个角色的健康状况中扣除一个数字。 playerHealth变为零的可能性非常小。当playerHealth低于零时,即使由于整数溢出,其变为零的可能性仍然非常小。所以,如果你想在他们的一个生命值变为零或更少时“杀死”这个角色,你最好用

之类的东西改变这一行。
while ( playerHealth > 0 && orcHealth > 0 )

另外,如果任何其中一个语句为真,则||语句有效。在C ++中,对于整数,0值为false,所有其他值(包括负值)都被视为true。此外,||从左到右进行检查,当它找到第一个true语句时,它会停止搜索。在您的情况下,它会检查playerHealth,这很可能是非零的。当它看到此表达式为true时,它会确定parantheses中的整个语句为true并跳过检查orcHealth >= 0。这导致无限循环。您可能希望查看C++maybe something like this post中条件的评估顺序。