本文介绍一道Intel的C语言笔试题,看似简单,其实有一个隐含的,容易被忽略的重要知识点。
问题:下面的程序输出是什么?
int main(){
fprintf(stdout,"Hello ");
fprintf(stderr,"World!");
return 0;
}
麦新杰看到这道题的时候,突然不会做了,答案如果是Hello World!,一定是错的。
先说正确答案:World!Hello 。
验证如下:
[xinlin@promote test]$ vi test.c
[xinlin@promote test]$ cat test.c
#include
int main(){
fprintf(stdout, "Hello ");
fprintf(stderr, "World!");
return 0;
}
[xinlin@promote test]$ gcc test.c
[xinlin@promote test]$ ./a.out
World!Hello
为什么会这样?
先复习以下两个知识点:
这道题的程序代码很简单,就是用fprintf先想stdout输出Hello,再向stderr输出World!,默认情况下,stdout和stderr这两个默认打开的文件描述符,都是指向显示器。
不过,这道题还考察一个细节,在默认情况下,输出到stdout的字节流有缓存,只有到换行的时候,才会真正输出。而stderr没有缓存,直接输出。
现在修改一下代码,将两行输出加上换行:
[xinlin@promote test]$ cat test.c
#include
int main(){
fprintf(stdout, "Hello \n");
fprintf(stderr, "World!\n");
return 0;
}
[xinlin@promote test]$ gcc test.c
[xinlin@promote test]$ ./a.out
Hello
World!
加上换行之后,这段C代码就按顺序向屏幕输出了。