快速提问,在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 ++会评估那条原始行吗?感谢。
答案 0 :(得分:11)
在C / C ++中,逻辑运算符短路。在a || b
如果a
为真b
未评估,则a && b
如果a
为假,则b
未评估。
小心:这只发生在&&
和||
,而不是|
和&
。
答案 1 :(得分:4)
它被称为short-circuit evaluation。但是,是的 - 关于“||”它是懒惰的,因为如果条件必须求值为真,那么它就会停止(例如,如果a为真,则(a || b)不会计算b)。和“&&”类似因为如果(a&& b)其中a是假b则不被评估。
答案 2 :(得分:2)
没有。延迟评估意味着仅在需要包含子表达式的表达式时才评估子表达式。由于您放弃了完整表达式的结果,因此延迟评估将评估无。
如果你写过writeBoolean(funcA() || funcB());
懒惰的评估会评估funcA(),因为这肯定是必要的,可能还有funcB。
但这不是C ++的工作原理; C ++没有懒惰的评估。即使您丢弃表达式的结果,它仍然会被评估。您做进行短路评估。是否调用funcB
不依赖于使用完整表达式,但它取决于funcA
的结果。