【发布时间】:2020-04-17 15:19:42
【问题描述】:
考虑如下函数:
unsigned int fact(unsigned int i) {
if (i <= 1) { return 1; }
return i * fact(i-1);
}
如果我要实例化一个新变量unsigned int f 这样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?
【问题讨论】:
-
该语言要求在应用操作之前评估所有操作数。只有逻辑运算符(
&&和||)在 C++ 中执行短路。 -
如果您删除打印,您是否检查了为 main 生成的优化代码?
标签: c++ return lazy-evaluation short-circuiting