考虑如下函数:
unsigned int fact(unsigned int i) {
if (i <= 1) { return 1; }
return i * fact(i-1);
}
如果要实例化一个新变量unsigned int f
that f = 0 * fact(5)
,为什么它不“短路”?
unsigned int fact(unsigned int i) {
std::cout << "a";
if (i <= 1) { return 1; }
return i * fact(i-1);
}
int main() {
unsigned int f = 0 * fact(5);
}
输出是aaaaa
。如果f
只能为零,为什么假设它知道返回类型,为什么还要调用函数呢?它不是从左到右求0 * (unsigned int)
值,看到并知道右值是0
吗?
对于&&
(逻辑和),||
(逻辑或)和?
(三元运算符),必须进行短路评估。对于其余的运算符,这是(可选)优化。
的评价fact(5)
在表达0 * fact(5)
不能在一般的优化掉,因为你知道,整个表达式的结果是0
,因为调用fact()
可能引入副作用(例如,修改某些全局变量),所以它必须被调用。
就像在此评论中所说,fact(5)
如果一个好的编译器可以证明没有副作用,那么它将优化对的调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句