Yve*_*ves 3 c c++ boolean-expression compiler-optimization
我知道 C/C++ 使用短路评估来评估布尔表达式。例如,C/C++ 肯定会在表达式中的操作数a之前计算操作数,如果为 false,则不会计算。ba && bab
此外,我知道5==6编译器可能会完全忽略诸如此类的事情,因为它是一个常量表达式,可以在编译时进行评估。
但是不知道b && 0编译器能不能优化?编译器可以说:好吧, 的求值0比 的求值容易得多b,并且b没有任何副作用,所以我决定先更改b && 0为0 && b求值0。
你的问题涉及两个独立的问题。第一个是当编译器“看到”if条件总是false(由于&& 0)时,它可以完全丢弃相应的分支。示例翻译单元:
bool f(int);
int main()
{
if (f(1) && 0)
return 1;
}
Run Code Online (Sandbox Code Playgroud)
启用优化后,很可能不会为分支生成机器代码。但是,f(1)表达式仍必须在运行时求值,因为编译器无法证明f(1)调用没有可观察的行为。
机器码:https : //godbolt.org/z/sEMrfh
相反,如果编译器可以证明f(1)没有可观察到的行为,它可以消除它的调用。这与求值顺序无关,而是与as-if规则有关。演示翻译单元:
static bool f(int i)
{
int j = i + 1;
return true;
}
int main()
{
if (f(1) && 0)
return 1;
}
Run Code Online (Sandbox Code Playgroud)
机器码:https : //godbolt.org/z/scs3je