bool a1,a2,a3,a4,...;
a1=false;
while (a1 && a2 && a3 && a4 && ...) {...}
Будут ли в цикле проверяться условия a2,a3,a4,... или проверка завершится сразу после проверки a1?
Проверка завершится на первом операнде. Это гарантируется стандартом:
&&guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.
в вольном переводе
Для оператора
&&гарантируется вычисление слева-направо: второй операнд не вычисляется, если первый равенfalse.
Аналогично и для оператора || - если первый операнд - true, вычисление второго не производистя.
Это правило НЕ применяется для побитовых & и |.
Так же не выполняется для перегруженных операторов &&, || (в стандарте не нашел)
Если a1=false, то другие && нет смысла проверять, поэтому проверка остановится на a1.
Это очень просто проверить:
#include <iostream>
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
mingw, и @Mike прав -- такое поведение одинаково для компиляторов
– gil9red
Mar 10 '16 at 10:51
false, я получу выигрыш?
– assaqs
Mar 10 '16 at 10:55
В логических операций «И» и «ИЛИ» существует один подвох. Дело в том, что они участвуют в ленивых вычислениях. В отличие от побитовых операций. Если первый операнд в операции «И» имеет значение «ложь», а первый операнд операции «ИЛИ» — «истина», то дальнейшие вычисления не производятся. Потому что они бесполезны и уже не могут изменить результата. Но побитовым операциям для вычисления результата второй операнд нужен всегда.
false, я получу выигрыш? – assaqs Mar 10 '16 at 10:54operator&&перегружен, то будет вычислятся условие полностью. Но я пока не нашел ссылку на это. – KoVadim Mar 10 '16 at 11:07if (p && *p ...) { ... }– avp Mar 10 '16 at 11:50switchи цепочкеif-else if- ...elseнужно выбрать лишь одно из условий, и компилятор делает это способом, который он считает оптимальным, на результате работы это не отразится, только на производительности. – Yuriy Orlov Mar 10 '16 at 12:09&&принимает исключительно операнды, которые могут быть преобразованы вboolи возвращаетboolже. Гарантия вычислений слева направо построена именно на этом. – αλεχολυτ Mar 10 '16 at 12:36msvc 12.0– Yuriy Orlov Mar 10 '16 at 13:08