3

考虑这个

Class* p = NULL;
if( p != NULL && p->Method() == OK ){

  // stuff
}

在我使用过的所有编译器上,这是非常安全的。即布尔表达式的第一部分将评估为false,因此不会尝试对 Method() 的调用,因为评估第二部分是多余的。

这是因为大多数编译器会优化第二部分的评估,还是它是 C/C++ 标准的规定行为?

4

6 回答 6

4

表达式快捷方式由标准保证。

于 2009-05-12T13:07:25.413 回答
4

这称为布尔短路,并被定义为许多语言。 是一篇维基百科文章,描述了哪些语言具有此功能。

现在您知道该功能的正确名称,还有其他关于它的 SO 文章

于 2009-05-12T13:09:10.230 回答
4

С++ 标准 1998
第 5.14 节

&& 运算符从左到右分组。操作数都被隐式转换为 bool 类型(第 4 条)。如果两个操作数都为真,则结果为真,否则为假。与 & 不同,&& 保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。

于 2009-05-12T13:10:20.993 回答
3

我还没有看到它提到过,所以:

C++ 保证短路,除非调用的&&or||运算符被重载。但是不要那样做,因为它太混乱了。

于 2009-05-12T13:16:07.687 回答
2

这是一种称为短路的功能。此行为由 C++ 标准保证。我不认为这是一种优化,但它更像是一种语言功能。

于 2009-05-12T13:08:25.333 回答
2

不只是优化,有用的是让你更简洁。

正如您的示例所示,它允许您在一行中编写一个“安全”的取消引用语句。否则,您必须执行以下操作:

if (p != null) {
    if (p.getValue() == 3) {
        // do stuff
    }
}

看起来微不足道,但尝试用没有它的语言(例如 VB6)进行编码,您就会开始非常想念它。

正如其他答案所提到的,它在语言标准中,但只是因为需要明确指定这样的内容。它可能编译成优化的代码是一个副作用。如今,一个像样的 C 或 C++ 编译器会等效地编译单行或两行语句

于 2009-05-12T13:19:17.210 回答