using yyparse() and fprintf



我有一段用于基本算术(add, diff)编译器的代码。在我的家乡。在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的所有语句都应该首先执行,然后在if之后执行printf ?为什么会有这种奇怪的行为?

这是标准错误和标准输出被不同地缓冲的结果。与yyparse无关。

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

标准输出通常是无缓冲的,所以它的输出是即时的。

如果您将输出与stdout和stderr混合,则实际输出的顺序可能颠倒。

顺便说一下,如果您只想输出一个固定字符串,最好使用puts(msg)(打印到stdout)或fputs(msg, file)puts在字符串的末尾自动输出一个换行符;如果出于某种原因您不希望这样做,请使用fputs(msg, stdout)

最新更新