Страницы

Поиск по вопросам

понедельник, 2 декабря 2019 г.

&& проверка условий

#cpp


bool a1,a2,a3,a4,...;
a1=false;
while (a1 && a2 && a3 && a4 && ...) {...}


Будут ли в цикле проверяться условия a2,a3,a4,... или проверка завершится сразу после
проверки a1?
    


Ответы

Ответ 1



Проверка завершится на первом операнде. Это гарантируется стандартом: && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false. в вольном переводе Для оператора && гарантируется вычисление слева-направо: второй операнд не вычисляется, если первый равен false. Аналогично и для оператора || - если первый операнд - true, вычисление второго не производистя. Это правило НЕ применяется для побитовых & и |. Так же не выполняется для перегруженных операторов &&, || (в стандарте не нашел)

Ответ 2



Если a1=false, то другие && нет смысла проверять, поэтому проверка остановится на a1. Это очень просто проверить: #include using namespace std; bool a1() { cout << "a1\n"; return true; } bool a2() { cout << "a2\n"; return true; } bool a3() { cout << "a3\n"; return false; } bool a4() { cout << "a4\n"; return true; } int main(int argc, char *argv[]) { while (a1() && a2() && a3() && a4()) { } return 0; } Консоль: a1 a2 a3

Ответ 3



В логических операций «И» и «ИЛИ» существует один подвох. Дело в том, что они участвуют в ленивых вычислениях. В отличие от побитовых операций. Если первый операнд в операции «И» имеет значение «ложь», а первый операнд операции «ИЛИ» — «истина», то дальнейшие вычисления не производятся. Потому что они бесполезны и уже не могут изменить результата. Но побитовым операциям для вычисления результата второй операнд нужен всегда.

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

Отправить комментарий