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