请考虑以下声明:
C a, b; //C contains c1, c2 and c3 all integers
if(a.c1==b.c1 && a.c2 == b.c2) {
a.c3=b.c3;
}
Run Code Online (Sandbox Code Playgroud)
此声明是否会针对以下内容进行优化:
if(a.c1 == b.c1) {
if(a.c2 == b.c2) {
a.c3=b.c3;
}
}
Run Code Online (Sandbox Code Playgroud)
AFAIK,C++编译器不执行此类操作,因为它可能有副作用.但这些都是内置类型.
是.以下代码段:
C a, b; //C contains c1, c2 and c3 all integers
if(a.c1==b.c1 && a.c2 == b.c2)
{
a.c3=b.c3;
}
Run Code Online (Sandbox Code Playgroud)
将被"优化"到这个(或类似的东西):
if(a.c1 == b.c1)
{
if(a.c2 == b.c2)
{
a.c3=b.c3
}
}
Run Code Online (Sandbox Code Playgroud)
这不是因为优化,而是因为C++标准需要 短路评估.因此,合理的符合标准的C++编译器应该能够使其短路.
C++标准中没有一个地方明确声明某些布尔运算符是短路的.这是从规则暗示:
ISO/IEC C++标准14882§5.14逻辑AND运算符[expr.log.and]
Run Code Online (Sandbox Code Playgroud)logical-and-expression: inclusive-or-expression logical-and-expression && inclusive-or-expression
- 在
&&左到右操作员组.操作数都隐式转换为类型bool(第4节).结果是true两个操作数都是true和false否则.不像&,&&保证左到右的评价:如果第一个操作数是不计算第二个操作数false.
||运营商的规则类似:
ISO/IEC C++标准14882§5.15逻辑OR运算符[expr.log.or]
Run Code Online (Sandbox Code Playgroud)logical-or-expression: logical-and-expression logical-or-expression || logical-and-expression
- 在
||左到右操作员组.操作数都隐式转换为bool(第4节).true如果其中任何一个操作数是true,false则返回它.不同于|,||保证从左到右的评估; 此外,如果第一个操作数的计算结果为,则不计算第二个操作数true.
和条件?运算符:
ISO/IEC C++标准14882§5.16条件运算符[expr.cond] conditional-expression:logical-or-expression logical-or-expression?表达式:赋值表达式
- 条件表达式从右到左分组.第一个表达式隐式转换为
bool(第4节).它被评估,如果是true,则条件表达式的结果是第二个表达式的值,否则是第三个表达式的值.除了临时破坏(12.2)之外,第一个表达式的所有副作用都发生在评估第二个或第三个表达之前.仅评估第二和第三表达式中的一个.
| 归档时间: |
|
| 查看次数: |
3612 次 |
| 最近记录: |