【发布时间】:2021-04-24 12:50:33
【问题描述】:
我知道 C/C++ 使用短路评估来评估布尔表达式。例如,C/C++ 肯定会在表达式a && b 中的操作数b 之前计算操作数a,如果a 为false,则不会计算b。
此外,我知道像5==6 这样的东西可能会被编译器完全忽略,因为它是一个常量表达式,可以在编译时计算。
但是不知道b && 0是否可以被编译器优化?编译器可以说:好的,0 的求值比b 的求值要容易得多,而且b 没有任何副作用,所以我决定将b && 0 改成0 && b 来求值@987654334先@@。
【问题讨论】:
-
取决于编译器 - 如果您查看汇编输出,则最简单。除非 b 是一个函数,否则编译器甚至可能不会生成任何代码,因为表达式始终为 false。
-
如果
b没有可观察到的行为并且编译器可以证明它,它很可能不会在运行时评估它。演示:godbolt.org/z/scs3je。请注意,这与首先评估0无关;这是关于 as-if 规则的。 -
@DanielLangr 那么如果
b是一个函数呢?
标签: c++ c compiler-optimization boolean-expression