考虑这个
Class* p = NULL;
if( p != NULL && p->Method() == OK ){
// stuff
}
在我使用过的所有编译器上,这是非常安全的。即布尔表达式的第一部分将评估为false,因此不会尝试对 Method() 的调用,因为评估第二部分是多余的。
这是因为大多数编译器会优化第二部分的评估,还是它是 C/C++ 标准的规定行为?
考虑这个
Class* p = NULL;
if( p != NULL && p->Method() == OK ){
// stuff
}
在我使用过的所有编译器上,这是非常安全的。即布尔表达式的第一部分将评估为false,因此不会尝试对 Method() 的调用,因为评估第二部分是多余的。
这是因为大多数编译器会优化第二部分的评估,还是它是 C/C++ 标准的规定行为?
表达式快捷方式由标准保证。
这称为布尔短路,并被定义为许多语言。 这是一篇维基百科文章,描述了哪些语言具有此功能。
现在您知道该功能的正确名称,还有其他关于它的 SO 文章。
С++ 标准 1998
第 5.14 节
&& 运算符从左到右分组。操作数都被隐式转换为 bool 类型(第 4 条)。如果两个操作数都为真,则结果为真,否则为假。与 & 不同,&& 保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。
我还没有看到它提到过,所以:
C++ 保证短路,除非调用的&&
or||
运算符被重载。但是不要那样做,因为它太混乱了。
这是一种称为短路的功能。此行为由 C++ 标准保证。我不认为这是一种优化,但它更像是一种语言功能。
不只是优化,有用的是让你更简洁。
正如您的示例所示,它允许您在一行中编写一个“安全”的取消引用语句。否则,您必须执行以下操作:
if (p != null) {
if (p.getValue() == 3) {
// do stuff
}
}
看起来微不足道,但尝试用没有它的语言(例如 VB6)进行编码,您就会开始非常想念它。
正如其他答案所提到的,它在语言标准中,但只是因为需要明确指定这样的内容。它可能编译成优化的代码是一个副作用。如今,一个像样的 C 或 C++ 编译器会等效地编译单行或两行语句