很简单,什么是尾部调用优化?更具体地说,任何人都可以显示一些可以应用的小代码片段,而不是在哪里,并解释为什么?
language-agnostic algorithm recursion tail-recursion tail-call-optimization
我遇到的代码来自一个似乎认为在结果为负时从另一个相同类型的整数中减去无符号整数的问题.因此,即使它恰好适用于大多数体系结构,这样的代码也是不正确的.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我能找到的C标准中唯一含糊不清的引用.
涉及无符号操作数的计算永远不会过度流动,因为无法用结果无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.
我想人们可以接受这个引用来表示当右操作数较大时,操作被调整为在模数截断数字的上下文中有意义.
即
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
而不是使用依赖于实现的签名语义:
0x0000 - 0x0001 ==(无符号)(0 + -1)==(0xFFFF但也是0xFFFE或0x8001)
哪种或哪种解释是对的?是否定义了?
在C++ 11中,作为一个没有副作用的无限循环,以下程序是UB:
int main() {
while (true) {}
}
Run Code Online (Sandbox Code Playgroud)
UB也是以下吗?
void foo() {
foo();
}
int main() {
foo();
}
Run Code Online (Sandbox Code Playgroud)
两个计划的标准引文都是理想的.