我有一段用于基本算术(add,diff)的编译器的代码。在我的mparse.y yacc文件中,我从main函数中读取了一个文件的输入。要调用解析,我将条件设置如下:
if(yyparse()==0)
fprintf(stderr,"Parsing complete.");
yyparse的最后一个语句,在完成之后应该是:
printf("The last statement of yyparse");
问题是,如果我使用fprintf(),我得到以下荒谬的输出:
Parsing Complete
The last statement of yyparse.
然而,如果我使用printf而不是fprintf,我会得到正常的输出。
The last statement of yyparse
Parsing complete.
第二个选项不应该是正确的,即yyparse的所有语句应该先执行然后printf后执行if?为什么这种奇怪的行为?
答案 0 :(得分:1)
这是stderr和stdout以不同方式缓冲的结果。它与yyparse无关。
Stdout通常是行缓冲的,这意味着输出保存在缓冲区中,直到打印换行符或文件描述符被关闭。
Stdout通常是无缓冲的,所以它的输出是立即的。
如果将输出混合到stdout和stderr,则可以反转实际输出的顺序。
顺便说一句,如果您只想输出固定字符串,最好使用puts(msg)
(打印到stdout)或fputs(msg, file)
。 puts
会自动在字符串末尾输出换行符;如果由于某种原因您不想要,请使用fputs(msg, stdout)