C++ 为什么printf()在递归函数中表现出异常行为?
我曾多次有过这样的经历:在递归函数中使用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
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);