C ИЛИ оператор отказывается останавливаться только тогда, когда 1-я часть истинна

#c

#c

Вопрос:

Я играл с некоторыми руководствами, и я дошел до части, где я использую «while», оператор OR останавливается только тогда, когда 1-е условие истинно, и не тогда, когда 2-е условие выполняется, даже если 2-е условие было истинным для некоторых циклов.

 while (humanCount > 0 || skeletonCount > 0)
{
    cout << "Humans left: " << humanCount << " | Skeletons left: " << skeletonCount << "n";
    if (currentTurn == 0) // Human Attack
    {
        if (rollChance(randomNum) >= 0.5f)
        {
            skeletonCurrentHealth -= rollDamage(randomNum);
            if (skeletonCurrentHealth <= 0)
            {
                skeletonCount--;
                skeletonCurrentHealth = skeletonMaxHealth;
            }
        }
        currentTurn = 1;
    }
    else // Skeleton Attack
    {
        if (rollChance(randomNum) >= 0.7f)
        {
            humanCurrentHealth -= rollDamage(randomNum);
            if (humanCurrentHealth <= 0)
            {
                humanCount--;
                humanCurrentHealth = humanMaxHealth;
            }
        }
        currentTurn = 0;
    }
}
  

Из печати я получаю что-то вроде:

 Humans left: 3 | Skeletons left: 5
Humans left: 3 | Skeletons left: 4
Humans left: 3 | Skeletons left: 3
Humans left: 2 | Skeletons left: 3
Humans left: 2 | Skeletons left: 2
Humans left: 2 | Skeletons left: 1
Humans left: 2 | Skeletons left: 0
Humans left: 2 | Skeletons left: -1
Humans left: 1 | Skeletons left: -1
Humans left: 1 | Skeletons left: -2
Humans left: 1 | Skeletons left: -3
Humans left: 0 | Skeletons left: -3
Humans have won!
  

Я здесь немного потерялся, хотел бы получить помощь, что я сделал не так.

Комментарии:

1. хотя не останавливается, когда условие истинно, оно останавливается, когда условие ложно, в вашем случае, когда обе части являются ложными. Прочитайте закон Д’Моргана

2. Или это неправильный вариант здесь, вам нужно некоторое время (humancount > 0 amp;amp; skeletoncount> 0)

Ответ №1:

while (humanCount > 0 || skeletonCount > 0) Означает, что ваш код продолжит выполняться, если ЛЮБОЕ из условий истинно. Если skeletonCount = -4 и humanCount = 2, то одно из условий по-прежнему истинно, поэтому ваш код продолжит выполняться. Вы хотите использовать И amp;amp;

Ответ №2:

Оператор OR ( || ) возвращает значение true, когда выполняется хотя бы одно условие. В вашем случае это означало бы, что и скелеты, и люди должны быть равны 0 или меньше, чтобы цикл остановился. Или, скорее, это продолжится, если хотя бы один из них равен > 0.
Вы получаете правильное поведение при использовании AND ( amp;amp; ), которое возвращает значение true только тогда, когда все операнды имеют значение true.