使用yyparse()和fprintf

时间:2015-10-23 16:18:06

标签: printf yacc lex

我有一段用于基本算术(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?为什么这种奇怪的行为?

1 个答案:

答案 0 :(得分:1)

这是stderr和stdout以不同方式缓冲的结果。它与yyparse无关。

Stdout通常是行缓冲的,这意味着输出保存在缓冲区中,直到打印换行符或文件描述符被关闭。

Stdout通常是无缓冲的,所以它的输出是立即的。

如果将输出混合到stdout和stderr,则可以反转实际输出的顺序。

顺便说一句,如果您只想输出固定字符串,最好使用puts(msg)(打印到stdout)或fputs(msg, file)puts会自动在字符串末尾输出换行符;如果由于某种原因您不想要,请使用fputs(msg, stdout)