返回信息流看代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello world!\nGoodbye world!");
volatile int a = *(int*)NULL; // 让程序崩溃
return 0;
}
选项:
A: Hello world!和Goodbye world!都不显示。
B: Hello world!显示,但Goodbye world!不显示。
C: Hello world!和Goodbye world!都显示。
D: 都不是,会随机显示"Hello world!\nGoodbye world!"的某个前缀。
这是一条镜像帖。来源:北邮人论坛 / cpp / #94067同步于 2016/11/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[毁三观]这个C程序输出什么?
nuanyangyang
2016/11/26镜像同步20 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
嗯。是这么回事。不过我是在读某个libc的源代码时发现的这个行为。不知道这个行为是否可以依赖。
【 在 tastier 的大作中提到: 】
: \n flush掉标准输出的缓冲
我记得APUE上有写,\n可以刷新stdout的缓冲区
【 在 nuanyangyang 的大作中提到: 】
: 嗯。是这么回事。不过我是在读某个libc的源代码时发现的这个行为。不知道这个行为是否可以依赖。
:
我在某个非unix-like的系统上发现了这个现象。或许不是unix特有的。
【 在 tastier 的大作中提到: 】
: 我记得APUE上有写,\n可以刷新stdout的缓冲区
查了查。C的FILE stream有buffer模式,可以是unbuffered, line-buffered或者fully-buffered。其中,每次遇到\n的时候进行传输,是line-bufered的行为。
但是,C并没有规定stdout用哪种缓冲方式。所以,实际上打印出什么,不仅仅依赖于C语言了。即使程序不做任何缓存,也不算错。
【 在 tastier 的大作中提到: 】
: 我记得APUE上有写,\n可以刷新stdout的缓冲区