bool f()
{
cout << "helolo,world\n";
return true;
};
int main()
{
false && f() == true;
Почему не будет вызвана функция, если приоритет == выше чем у &&? С++
Потому что есть правило сокращенных вычислений логических выражений.
Если уже понятно, что результат будет false
- а иным при операции &&
и первом аргументе false
он быть не может - вторая часть не вычисляется вовсе.
Для ||
- то же самое, если первая часть вычислена как true
.
Очень удобно - например,
if (p && *p == 0) ...
Если p
- нулевой указатель, разыменования не будет.
Грубо говоря,
if (a && b) {
превращается в
if (a) {
if (b) {
Из стандарта:
7.6.14 Logical AND operator [expr.log.and]
1 The && operator groups left-to-right. The operands are both contextually converted to bool (7.3). The result is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.
7.6.15 Logical OR operator [expr.log.or]
1 The || operator groups left-to-right. The operands are both contextually converted to bool (7.3). The result is true if either of its operands is true, and false otherwise. Unlike |, || guarantees left-to-right evaluation; moreover, the second operand is not evaluated if the first operand evaluates to true.
Если есть сомнения, поставьте скобки в разных местах выражения(подсказка от Andrej Levkovitch ):
(false && f()) == true;
левая часть выдаст false
и не будет проверена правая часть выражения в скобках, останется проверять еще выражение false == true
(лишняя операция)
false && (f() == true);
так как левая часть false
, не будет проверяться правая часть, т.е. false && (
выражение не вычисляется)
имеет результат false
.
А значит второй вариант все таки получше первого, хотя и результат одинаков, если слева оператора &&
, есть ложь. Так что ставить скобки не всегда есть хорошо...
Булева логика такова, что проверяется слева направо. У вас первый операнд равен False, далее идёт оператор &&. Этот оператор подразумевает, если операнд слева равен False, то последущие операнды не будут проверяться, т.к это не имеет смысла, т.к всё выражение всё равно будет равно False. Если хотите чтобы функция выполнилась нужно использовать одиночный оператор &.
if(false & f() == true) // условие будет ложным, но функция f() будет вызвана
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть QByteArray, как в него поместить, а потом извлечь битовые поля? Без побитовых сдвигов
При компилировании выдает ошибку Вызвано исключение по адресу 0x77C7F94D (ntdlldll) в test2
Подскажите пожалуйста, по решению вопросаУ меня есть колонка STATE (boolean), добавил колонку NAME (varchar)