当前位置: 技术问答>linux和unix
奇怪的执行顺序,不知是否和gcc版本有关
来源: 互联网 发布时间:2016-01-29
本文导语: 现有如下的C程序: /* test.c */ #include int main() { printf("Strange Hello World"); while(1){}; return 0; } 理论上程序的执行结果应是在终端中输出Strange Hello World然后陷入死循环。但奇怪的是实际...
现有如下的C程序:
/* test.c */
#include
int main()
{
printf("Strange Hello World");
while(1){};
return 0;
}
理论上程序的执行结果应是在终端中输出Strange Hello World然后陷入死循环。但奇怪的是实际的执行结果是“Strange Hello World”这条消息根本没有输出就进入了死循环!之后把printf语句改为
printf("Strange Hello Worldn");
增加了一个换行符,程序的执行结果就跟理论一样了。后来以为是不是输出的消息末尾为转义字符就可以,但把‘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。
/* test.c */
#include
int main()
{
printf("Strange Hello World");
while(1){};
return 0;
}
理论上程序的执行结果应是在终端中输出Strange Hello World然后陷入死循环。但奇怪的是实际的执行结果是“Strange Hello World”这条消息根本没有输出就进入了死循环!之后把printf语句改为
printf("Strange Hello Worldn");
增加了一个换行符,程序的执行结果就跟理论一样了。后来以为是不是输出的消息末尾为转义字符就可以,但把‘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"。
要习惯在printf的最后加上"n"。
|
stdout在终端输出时是行缓存, 其他情况下是全缓存.
由于是行缓存, 只有在遇到换行或者程序结束时才会输出.
--------------------------------
正解
或则你也可以强制刷新到屏幕上:
fflush(stdout);