“布尔短路”是由标准规定还是主要用作优化? [复制]

Posted

技术标签:

【中文标题】“布尔短路”是由标准规定还是主要用作优化? [复制]【英文标题】:Is "boolean short circuiting" dictated by standard or just mostly used as optimization? [duplicate] 【发布时间】:2010-10-25 13:24:15 【问题描述】:

考虑一下

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

  // stuff

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

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

【问题讨论】:

只是在这里添加一个快速注释,但如果标准不允许,编译器不会优化任何内容。编译器的工作是生成表现得好像已遵循标准的代码。因此,编译器绝不能优化掉可能影响程序行为的代码。 嗯,我以前从未见过有人投票结束他自己的问题作为 dup。我认为你应该为此获得徽章! @Paul:干杯,但这也是一个特例,因为我从一开始就不知道要搜索什么。 实际上,因为不知道要搜索的正确词而提出重复的问题并不罕见。 将此添加为注释,如果您想要非短路和或您可以使用&| 而不是&&||,它们同时执行按位运算和非短路布尔逻辑。 【参考方案1】:

这称为布尔短路,在许多语言中都有定义。 Here 是一篇***文章,描述了哪些语言具有此功能。

既然您知道该功能的正确名称,那么还有other SO articles 关于它。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

С++ 标准 1998 第 5.14 节

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

【讨论】:

哪个标准?我们有 C 和 C++ 标准来保证这一点,更不用说许多其他语言了,还有两个版本的 C 标准(这个基本的东西很可能已经改变了位置)。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

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

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

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

【讨论】:

以上是关于“布尔短路”是由标准规定还是主要用作优化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

&= 和 |= 运算符是不是用于布尔短路?

SQL Server提高事务复制效率优化订阅初始化优化

TCP双方的缓存是由啥规定大小的?谢谢

条型码编码规则是怎样规定的?

linux目录配置标准有何规定?

XML