考虑本

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

  // stuff
}

在我使用过所有的编译器,这是相当安全的。即布尔表达式的第一部分将计算为,并且呼叫的方法()将因此不会因为评估第二部分是多余的尝试。

这是因为大多数的编译器将优化掉所述第二部分的评价,或者是它从C / C ++标准规定的行为?

有帮助吗?

解决方案

此被称为布尔短路,并且被定义为多种语言。 这里是描述哪些语言具有此功能。

维基百科文章

现在您为特征知道正确名称,还有其他SO文章了解它。

其他提示

表达短切削由标准保证。

С++标准1998,点击 部分5.14

  

在&&操作员组左到右。   操作数都隐含   转换为bool类型(第4章)。该   如果两个操作数都是结果为真   真实,否则为false。不同于与,&&   左到右的保证评价:   第二个操作数不评估如果   第一操作数是错误的。

我还没有看到它尚未提到的,这样:

的短路被C ++保证的正在被调用的&&||操作时除外过载即可。但不这样做,因为这是太混乱了。

这是一个所谓的短路的功能。此行为是由C ++标准保证。我不相信这是一个优化可以这么说,但它更简单的语言功能。

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

作为例子显示,它可以让你在同一行写了“安全”提领声明。否则,你需要做的是这样的:

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

似乎微不足道,但在没有它(例如VB6)语言尝试编码,你开始非常想念它。

这是在语言标准,其他的答案提到,但明确规定,只是因为这样的事情需要。它可以可能向下编译到优化的代码是一个副作用;这些天,体面C或C ++编译器将编译一行或两行语句equivilently

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top