6

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

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,但我不确定标准是否保证了这一点。

4

2 回答 2

10

这是未定义的行为。

[statement.decl]/4

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

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

结束示例]

于 2013-10-25T21:03:30.987 回答
2

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

auto abc() -> int;

auto xyz() -> int  
{
    return abc();
}

auto abc() -> int 
{
    return xyz();
}

int main() 
{
    int tmp = xyz(); // defined behavior, but infinite recursion
}
于 2013-10-25T21:05:45.347 回答