C++ 为什么printf()在递归函数中表现出异常行为?

C++ 为什么printf()在递归函数中表现出异常行为?,c++,recursion,printf,C++,Recursion,Printf,我曾多次有过这样的经历:在递归函数中使用printf(),结果是一个随机数。但是,使用fflush(stdout)可以修复输出。为什么会发生这种情况?例如: 下面的代码是一个段树实现。函数的作用是:返回给定范围内的最大元素 node rangeQuery(node* tree, int root, int lml, int rml, int u, int v) { //query [u,v] where all descendants of root are in

我曾多次有过这样的经历:在递归函数中使用printf(),结果是一个随机数。但是,使用
fflush(stdout)
可以修复输出。为什么会发生这种情况?例如:

下面的代码是一个段树实现。函数的作用是:返回给定范围内的最大元素

    node rangeQuery(node* tree, int root, int lml, int rml, int u, int v)
    {
        //query [u,v] where all descendants of root are in [lml,rml]

        fflush(stdout);     //<<<<------------------------------HERE
        if (u<=lml && rml<=v)
            return tree[root];

        int m=(lml+rml)/2, lc=root*2, rc=root*2+1;
        tree[root].split(tree,tree[lc],tree[rc]);

        node l,r;

        if (u <= m)
            l = rangeQuery(tree, lc, lml, m, u, v);
        if (v > m)
            r = rangeQuery(tree, rc, m+1, rml, u, v);

        tree[root].merge(tree,tree[lc],tree[rc]);

        node res;
        res.merge(tree, l, r);
        return res;
    }
    int main()
    {
        //....
        int opt,a,b;
        scanf("%d%d%d",&opt,&a,&b);
        a--;
        b--;
        node newNode;
        newNode = rangeQuery(tree, 1, 1<<n, (1<<(n+1))-1, a+(1<<n), b+(1<<n));
        printf("%d",newNode.val);
        //....
    }
节点范围查询(节点*树、int根、int lml、int rml、int u、int v)
{
//查询[u,v],其中根的所有子代都在[lml,rml]中
fflush(stdout);//这个:


缺少终止换行符,因此输出将被缓冲,直到打印下一个换行符,或者调用
fflush(stdout);
。这可能解释您看到的内容。

尽管存在各种错误,包括:

  • 使用C++程序对象中C++对象的可变长度数组;
  • <>混合C(<代码> SCANF)和C++输入(<代码> CIN < /代码>);
  • 使用内部标题
错误的主要原因是未初始化的变量:

    node l,r;   // **** here

    if (u <= m)
        l = rangeQuery(tree, lc, lml, m, u, v);
    if (v > m)
        r = rangeQuery(tree, rc, m+1, rml, u, v);

    tree[root].merge(tree,tree[lc],tree[rc]);

    node res;
    res.merge(tree, l, r);
节点l,r;//**
如果(单位m)
r=范围查询(树,rc,m+1,rml,u,v);
树[root]。合并(树,树[lc],树[rc]);
节点资源;
res.merge(树,l,r);
如果任一条件不成立,则
l
r
将被取消初始化,这意味着对
res.merge
的调用具有未定义的行为


节点l{},r{};
初始化它们会导致程序输出
3
,尽管它可能仍然包含其他错误。

问题无法说明预期的结果和获得的结果。问题描述仅包含一个词,“乱码”,这是含糊不清的。@DavidSchwartz好的,我会补充一些details@Ambar您不仅应该添加所需内容的详细信息,还应该将代码减少到绝对必要的最小值。这一方面是信息太多,另一方面是信息太少。@DavidSchwartz我已修复它,请现在查看删除
fflush
没有效果。这个问题是无效的。我们永远不会知道,除非他说什么不对/他期望看到什么!@Poldie我编辑了它,我想它现在更具解释性了。
    node l,r;   // **** here

    if (u <= m)
        l = rangeQuery(tree, lc, lml, m, u, v);
    if (v > m)
        r = rangeQuery(tree, rc, m+1, rml, u, v);

    tree[root].merge(tree,tree[lc],tree[rc]);

    node res;
    res.merge(tree, l, r);