日期:2014-05-16  浏览次数:20747 次

奇怪的执行顺序,不知是否和gcc版本有关
现有如下的C程序:
/*   test.c   */
#include   <stdio.h>

int   main()
{
        printf( "Strange   Hello   World ");
        while(1){};
     
        return   0;
}

  理论上程序的执行结果应是在终端中输出Strange   Hello   World然后陷入死循环。但奇怪的是实际的执行结果是“Strange   Hello   World”这条消息根本没有输出就进入了死循环!之后把printf语句改为
printf( "Strange   Hello   World\n ");
  增加了一个换行符,程序的执行结果就跟理论一样了。后来以为是不是输出的消息末尾为转义字符就可以,但把‘\n’换成‘\t’也不行。编译后的汇编代码如下:
        .file         "test.c "
        .section         .rodata
.LC0:
        .string         "Strange   Hello   World "
        .text
.globl   main
        .type         main,   @function
main:
        leal         4(%esp),   %ecx
        andl         $-16,   %esp
        pushl         -4(%ecx)
        pushl         %ebp
        movl         %esp,   %ebp
        pushl         %ecx
        subl         $4,   %esp
        movl         $.LC0,   (%esp)
        call         printf
.L2:
        jmp         .L2
        .size         main,   .-main
        .ident         "GCC:   (GNU)   4.1.0   20060304   (Red   Hat   4.1.0-3) "
        .section         .note.GNU-stack, " ",@progbits
  汇编代码显示程序是确实是调用printf之后再执行死循环的,与理论估计相同。编译器的版本GCC:   (GNU)   4.1.0   20060304   (Red   Hat   4.1.0-3) "
,操作系统Fedora   Core   5,机器平台为Intel(R)   Pentium(R)   4   CPU   3.00GHz,主板华硕P4P800。

------解决方案--------------------
stdout的缓存所致,和gcc没关系
------解决方案--------------------
stdout在终端输出时是行缓存, 其他情况下是全缓存.
由于是行缓存, 只有在遇到换行或者程序结束时才会输出.
------解决方案--------------------
楼上正解!
要习惯在printf的最后加上 "\n "。
------解决方案--------------------


stdout在终端输出时是行缓存, 其他情况下是全缓存.
由于是行缓存, 只有在遇到换行或者程序结束时才会输出.
--------------------------------
正解
或则你也可以强制刷新到屏幕上:
fflush(stdout);