C++ ленивая оценка логического или в выражении вызова функции

быстрый вопрос, в C++ это выражение, лениво оценивать?

bool funca();
bool funcb();

funca() || funcb(); // line in question

очевидно, что это (потенциально) условное обозначение следующее:

bool funca();
bool funcb();

if (!funca()) {
    funcb();
}

// or even more concisely:

if (!funca()) funcb();

будет ли c++ оценивать эту исходную строку, о которой идет речь, как я надеюсь? Спасибо.

3 ответов


в C/C++ логические операторы короткого замыкания. В a || b Если a истинно b не оценивается и в a && b Если a является false b не оценивается.

осторожно: это происходит только с && и ||, а не | и &.


Это называется оценка короткого замыкания. Но, да-это лениво, в отношении"||", в том, что если условие должно оцениваться как true, то оно останавливается (например, если (a || b) не будет оценивать b, если a истинно). И аналогично с "& & " в том, что если (a && b), где A является ложным, b не оценивается.


нет. Ленивая оценка означает, что подвыражение оценивается только тогда, когда необходимо выражение, в котором оно содержится. Поскольку вы отбрасываете результат полного выражения, ленивая оценка будет оценивать ничего.

Если бы вы написали writeBoolean(funcA() || funcB()); ленивая оценка оценивала бы funcA (), так как это определенно необходимо и, возможно, funcB.

но это не так, как работает C++; C++ не имеет ленивой оценки. Даже если вы отбросите результат выражения все еще оценивается. Вы do получить оценку короткого замыкания. Ли funcB вызывается не зависит от использования полного выражения, но это зависит от результата funcA.