@Nivich

Почему из двух функций, стоящих в условии цикла, при определенных условиях выполняется только одна?

У меня есть некая функция func, которая при определенных условиях возвращает либо true, либо false. Я поместил их в условие цикла, чтобы он выполнялся, пока хотя бы одна из функций возвращает true. Выглядит это примерно так:
while(func(1) or func(2)){
//......
}

Но столкнулся с такой проблемой: если первая функция возвращает true, то вторая функция даже не выполняется. Если поменять or на and, то ситуация повторяется, но наоборот: если первая возвращает false, то вторая не выполняется. В чем проблема и можно ли ее как-то обойти?
  • Вопрос задан
  • 61 просмотр
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Фокус в оптимизации логических операций.
Если первый операнд AND имеет значение false, то результат будет false независимо от значения второго операнда. Соответственно, вычислять второй операнд смысла нет.
Аналогично, если первый операнд OR имеет значение true, то результат будет true независимо от значения второго операнда.
Если вам нужно, чтобы выполнялись обе функции, то решением, как ни странно, будет явный вызов обоих функций в теле цикла с записью результатов выполнения в переменные.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Но столкнулся с такой проблемой: если первая функция возвращает true, то вторая функция даже не выполняется. Если поменять or на and, то ситуация повторяется, но наоборот: если первая возвращает false, то вторая не выполняется.

Поздравляю, ты открыл для себя детали работы операторов || и && в С и С++.

как-то обойти?


bool f1 = func(1);
bool f2 = func(2);
if (f1 || f2)


Можно схитрить и использовать побитовое или вместо логического, но, как минимум, это заслуживает комментария, зачем так сделано:
while (func(1) | func(2))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы