#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. Это очень просто проверить: #includeusing 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
В логических операций «И» и «ИЛИ» существует один подвох. Дело в том, что они участвуют в ленивых вычислениях. В отличие от побитовых операций. Если первый операнд в операции «И» имеет значение «ложь», а первый операнд операции «ИЛИ» — «истина», то дальнейшие вычисления не производятся. Потому что они бесполезны и уже не могут изменить результата. Но побитовым операциям для вычисления результата второй операнд нужен всегда.
Комментариев нет:
Отправить комментарий