这是因为puts
它还输出一个换行符,在可以确定为交互式的设备上,默认情况下会导致刷新(对于标准输出)(a)。
如果您最初printf
在末尾输出换行符,您应该会看到类似的效果:
printf("hello, world\n");
或者如果你fflush (stdout);
在sleep()
打电话之前。
的相关部分C11
是7.21.3 Files
,部分/7
:
在程序启动时,三个文本流是预定义的,不需要显式打开——标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。最初打开时,标准错误流没有完全缓冲;当且仅当可以确定流不引用交互式设备时,标准输入和标准输出流才被完全缓冲。
这可以追溯到C89/90 4.9.3 Files
:
在程序启动时,预定义了三个文本流,不需要显式打开——标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。打开时,标准错误流没有完全缓冲;当且仅当可以确定流不引用交互式设备时,标准输入和标准输出流才被完全缓冲。
(a) : 没那么简单。对于初学者来说,这是依赖于实现的,因为标准规定构成交互式设备的东西是依赖于实现的(行为是指定的,但不是影响该行为的事物)。
其次(根据此处),标准仅在标准输出完全缓冲时(当设备绝对不是交互式时)强制要求。对于交互式设备,它是无缓冲的还是行缓冲的,是一个实现决定。