间接递归,因静态变量

Indirect recursion, dependent static variables

本文关键字:静态 变量 递归      更新时间:2023-10-16

标准定义的以下间接递归的结果还是未定义的行为?

auto abc() -> int ;
auto xyz() -> int  {
    static int instance = 3 + abc();
    return instance;
}
auto abc() -> int {
    static int instance = 2 + xyz();
    return instance;
}
int main() {
    int tmp = xyz();//or abc();
}

在VS2012中,tmp是5,但我不确定标准是否保证了这一点。

这是

未定义的行为。

[声明.decl]/4

如果在初始化变量时控件以递归方式重新输入声明,则行为是未定义的。[示例:

int foo(int i) {
    static int s = foo(2*i); // recursive call - undefined
    return i+1;
}

结束示例 ]

这不应该导致任何编译器产生任何有用的东西。 这是无限递归,可能会导致分段错误或堆栈溢出堆错误(取决于系统),即使您修复了尝试递归设置静态变量值的未定义行为:

auto abc() -> int;
auto xyz() -> int  
{
    return abc();
}
auto abc() -> int 
{
    return xyz();
}
int main() 
{
    int tmp = xyz(); // defined behavior, but infinite recursion
}