奇怪的执行顺序,不知是否和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);