是否可以在不获取stackoverflow的情况下执行以下操作?
int foo(int i = 0)
{
return foo(--i) || i;
}
当foo(--i
)求值为0
时,它应该返回false,因此返回i
并结束执行。
答案 0 :(得分:4)
你想要return !i || foo(--i)
。
请注意,||
是短暂的。这意味着只要表达式的结果未知,评估(从左到右执行)将继续。所以我编写它的方式,i
为零的情况将阻止递归。
(继续讨论更高级的问题,当相同的变量出现在多个子表达式中时,你需要非常小心,并且在某些子表达式中它的值会发生变化。我的!i
和--i
可能让我遇到麻烦:我离这里的未定义的行为并不太远。实际上,事实证明我的代码是完全安全的,因为||
是一个序列点和||
的评估顺序是明确定义的。但要小心。)
答案 1 :(得分:-1)
你编码的foo
永远不会返回,因为它将继续递减i
并递归。您需要在foo
内查看,当i
为0
时,您需要返回任何内容。