“布尔短路”是由标准规定还是主要用作优化? [复制]
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++ 编译器会等效地编译单行或两行语句
【讨论】:
以上是关于“布尔短路”是由标准规定还是主要用作优化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章