是“布尔短路”的标准,或只是主要被用作优化决定? [重复]
-
21-08-2019 - |
题
考虑本
Class* p = NULL;
if( p != NULL && p->Method() == OK ){
// stuff
}
在我使用过所有的编译器,这是相当安全的。即布尔表达式的第一部分将计算为假,并且呼叫的方法()将因此不会因为评估第二部分是多余的尝试。
这是因为大多数的编译器将优化掉所述第二部分的评价,或者是它从C / C ++标准规定的行为?
其他提示
表达短切削由标准保证。
С++标准1998,点击 部分5.14
在&&操作员组左到右。 操作数都隐含 转换为bool类型(第4章)。该 如果两个操作数都是结果为真 真实,否则为false。不同于与,&& 左到右的保证评价: 第二个操作数不评估如果 第一操作数是错误的。
我还没有看到它尚未提到的,这样:
的短路被C ++保证的正在被调用的&&
或||
操作时除外过载即可。但不这样做,因为这是太混乱了。
这是一个所谓的短路的功能。此行为是由C ++标准保证。我不相信这是一个优化可以这么说,但它更简单的语言功能。
这不只是优化,它是有用的,让你更为简洁。
作为例子显示,它可以让你在同一行写了“安全”提领声明。否则,你需要做的是这样的:
if (p != null) {
if (p.getValue() == 3) {
// do stuff
}
}
似乎微不足道,但在没有它(例如VB6)语言尝试编码,你开始非常想念它。
这是在语言标准,其他的答案提到,但明确规定,只是因为这样的事情需要。它可以可能向下编译到优化的代码是一个副作用;这些天,体面C或C ++编译器将编译一行或两行语句equivilently
不隶属于 StackOverflow