C语言的一个问题(可能有关编译器的行为,高手请进)

我在练习C程序时出现这样一个问题:
#include <iostream.h>

struct bitree
{
int data;
bitree *lchild;
bitree *rchild;
};

void preorder(bitree *root);
void postorder(bitree *root);
bitree *createtree();

bitree *createtree()
{
int a;
cin >> a;
if( a != 0 )
{
bitree *q = new bitree;
q -> data = a;
q -> lchild = createtree();
q -> rchild = createtree();
return q;
}
else
return NULL;
}

inline void preorder( bitree *root )
{
if( root != NULL )
{
cout << root -> data << " ";
preorder( root -> lchild );
preorder( root -> rchild );
}
}

inline void postorder( bitree *root )
{
if( root != NULL )
{
postorder( root -> lchild );
postorder( root -> rchild );
cout << root -> data << " ";
}
}

void main()
{
bitree *head = NULL;
head = createtree();

cout << "create a tree already!" << endl;

preorder(head);
cout << "\n";
postorder(head);
cout << "\n";
#if 0
/************************************
如果加入while()循环,则只输出
create a tree already!
而 preorder(head);
cout << "\n";
postorder(head);
cout << "\n";
则无效!(没有相应的输出)
为什么?
************************************/
while(1)
{
}
#endif

}
问题补充:我知道while()循环是不必要的,但是这个循环的加入却产生了意料之外的情况,我想了解其原因

实在抱歉,是我问题描述不好.
我的输入文件是indata.txt:
1
2
0
0
3
4
6
0
0
0
5
0
0
在没有加入while()循环时,
我的输出文件是outdata.txt:
create a tree already!
1 2 3 4 6 5
2 6 4 5 3 1

当加入while()以后,
我的输出结果变成了:
create a tree already!

原本以为while()循环对它之前的函数没有影响的,应该能正确输出前面的结果以后再进入无限等待,可是却不是这样的,我不理解为什么这个while()循环会对之前的两个函数preorder(head); postorder(head); 产生影响,按程序的执行顺序应该不会的啊......
呵呵,恩,是啊,这是我偶然发现的,当时只是想让程序执行完以后不要结束掉,不成想却出现了这种情况,我怀疑跟编译器的某些行为有关(以前我一直认为编译器应该是遵循线性顺序原则编译的),你说的调试时是错误的(运行时正确的程序)我想可能是因为当中的递归函数的原因,递归函数里调用输入函数可能会导致这样的问题吧(不是非常肯定是不是输入函数的原因)。

我郁闷了!!!!!
我刚才我换了个编译器,C-free 4.0 问题消失。。。。完全没有错误。。。。看来是VC++6.0 编译器的问题了。。。。

我在跑这个程序时也遇到了同样的问题,程序是先执行的while语句然后再输出的。但在调试时程序的确是按顺序执行的!
而且,我还发现在debug下即使去掉while语句,也不能输出结果。
调试到二叉树前序和后序遍历的函数中的输出语句时程序正常执行,root -> data的值都是正确的,但就是没有输出!真是奇哉怪也!

网上搜了一下调试和运行时得到的结果不一样的问题,但都是在debug下可以得到正确结果,运行时出错。像这个在调试时出问题,运行正确的情况还真是罕见。百思不得其解!

抱歉没有能帮你解决问题。
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答