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下可以得到正确结果,运行时出错。像这个在调试时出问题,运行正确的情况还真是罕见。百思不得其解!

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

关于C语言的一个问题,高手请进
这点大家应该都没有问题,但main()中通过调用a()来间接调用b()函数需不需要b()的头文件呢,答案是不需要的,从编译过程中,我们知道,编译器把a.c、b.c和main.c分别编译成a.o、b.o和main.o的目标文件,

一段C语言代码不知道错哪儿了,请高手指教
程序中的错误,按照其产生的原因和引起的后果,通常可以分为三种类型:即语法错误、编译运行错误和逻辑错误。一、语法错误 所谓“语法错误”是指由于违反了语言有关语句形式或使用规则而产生的错误。比如错误地使用了关键字、遗漏了某些必需的标点符号、分支语句或循环语句不完整或不匹配等都会导致语法错误。

编程高手请进!(C语言)
printf("\\n NEXT?(Y\/N):");\/*选择是否重新游戏*\/ scanf("%c",&yes);} } 2.include <stdio.h> void main(){ int gj, mj, xj, t1, t2;for (gj=1; gj<=20; gj++){ for (mj=1; mj<34; mj++){ xj=100-gj-mj;t1=xj%3;t2=5*gj+3*mj+xj\/3;if (t1==0&&t2==100...

C语言编程问题.请高手进(附源码)!!!HELP
printf("\\n请输入拼音码(菜名首字母)&编码&价格{回车确定}\\n");scanf("%s%d%f",c,&d,&e);printf("此款菜:类别为%d,编码为%d,拼音吗为%s,菜名为%s,价格为%f\\n是否正确?(正确请输入1,否则按任意键退出):",b,d,c,A,e);scanf("%d",&f);\/\/---&f if (f==1)fprintf(g,"此款...

高分C语言问题~~·高手请进
1. (数组A)n个数字从小到大排序 (例如:1,2,9)2. 取上步中最小的两个数相加之和为一个M , S=S+M 3. 数组A中除去最小的两个数,然后将M加进去形成一个新数组A元素个数为 n=n-1 4. n>1时回到1.否则函数返回S+A[0] (或S+M,因为最后A[]中只有一个元素了,就是M)} 没有考虑...

c语言问题,高手请进谢谢!!!
3、此时前面有两个i等待运行,即i+i--->这两个i些时都是3;而不是一个2,一个3;4。再一个++i 此时i加1得到i,i=3+1=4;由上面的理解知道i此时已经是4,5、由上面四步得到一个i=4,i+i+i的式子,写入数据得到12 今天上课还在纠结这个问题,一看到你的问题突然想起来了!呵呵 ...

C语言高手请进~~~
static struct s a[3]={1,&a[1],2,&a[2],3,&a[0]},这里定义了一个 结构数组a ,并且将其初始化了,其中a[0]={1,&a[1]},a[1]={2,&a[2]} a[2]={3,&a[0]},后面ptr = &a[1];就是让ptr指向a[1],所以ptr的值就是{2,&a[2]},也就是ptr->i1=2,答案d又...

高手请进!你好,请把我写一个C语言的编程题,本人不胜感激!
printf("请输入第%d个学生的成绩:\\n",i+1);scanf("%d",&a[i]);} } void jsSort(int a[],int b[]){ int i,j,t1,t2;for(i=0;i<5-1;i++)for(j=0;j<5-1;j++){ if(a[j]<a[j+1])\/\/排序 { t1=a[j];a[j]=a[j+1];a[j+1]=t1;t2=b[j];b[j]=b[j+1...

C语言写关机程序语问题,高手请进!
("HKEY_LOCKAL"多了下个字母“K",原样是HKEY_LOCAL,CONSTBYTE* 改成CONST BYTE*,要空格,要注要括号,自己仔细看清楚吧!本程序不存在逻辑错语。本人是(网友世界2009 NO.14 64页) 用C语言写关机整人小病毒的作者,有问题与作者联系,本程序只用于学习,不得用本代码来修改注册表来进行映像...

求C语言程序,高手请进...
\/*1.输入一个以回车结束的字符串(少于80个字符),将其中的大写字母用下面列出的对应大写字母替换,其余字符不变,输出替换后的字符串 原字母 对应字母 A Z B Y C X D W X C Y B Z A*\/ \/*#include <stdio.h> void main(){ char str[80];char a;int i=0;s...

相似回答