C 什么是';传输';printf函数返回的平均值?

C 什么是';传输';printf函数返回的平均值?,c,language-lawyer,C,Language Lawyer,我对标准C库中的printf返回值和缓冲流的解释感到困惑 在中,7.19.6.3/p3定义了printf函数在成功时返回非负的“传输字符数”。 此外,7.19.3/p3描述了“传输到主机环境或从主机环境传输”的完全/线路缓冲流的行为,p7表示,stdout可以是完全缓冲流 引用第7.19.3节,并添加重点: 7.19.3文件 3当流未缓冲时,字符将尽快从源或目标显示。否则,字符可能会被累积,并作为块传输到主机环境或从主机环境传输。当流被完全缓冲时,当缓冲区被填满时,字符将作为块传输到主机环境或从

我对标准C库中的
printf
返回值和缓冲流的解释感到困惑

在中,7.19.6.3/p3定义了
printf
函数在成功时返回非负的“传输字符数”。 此外,7.19.3/p3描述了“传输到主机环境或从主机环境传输”的完全/线路缓冲流的行为,p7表示,
stdout
可以是完全缓冲流

引用第7.19.3节,并添加重点:

7.19.3文件

3当流未缓冲时,字符将尽快从源或目标显示。否则,字符可能会被累积,并作为块传输到主机环境或从主机环境传输。当流被完全缓冲时,当缓冲区被填满时,字符将作为块传输到主机环境或从主机环境传输。 当对流进行行缓冲时,当遇到新行字符时,字符将作为块传输到主机环境或从主机环境传输。此外,当缓冲区被填满时,当在无缓冲流上请求输入时,或者当在需要从主机环境传输字符的行缓冲流上请求输入时,字符打算作为块传输到主机环境。对这些特性的支持由实现定义,并可能通过
setbuf
setvbuf
功能受到影响

7[…]初始打开时,标准错误流未完全缓冲;标准输入流和标准输出流被完全缓冲当且仅当可以确定流不引用交互设备时

这些定义导致以下行为是合法的。 但这是违反直觉和不可接受的结果(至少对我来说)

#包括
#包括
//前提条件:`stdout`已完全缓冲
int main()
{
int n=printf(“abc”);/“abc”是累积的,没有传输。
assert(n==0);//所以,返回值可以等于0??
}
我的解释有什么错?
或者它只是“实现定义的”行为之一?

printf和
fprintf
的返回值是传输到流(主机环境中的对象)而不是最终目标的字节数。流何时以及如何将这些字节传输到文件或设备(“从主机环境传输”)无关紧要。缓冲不影响流从程序接收字节的方式;只是在将它们发送到相关的文件或设备之前,它是否会一直保存它们。

单词“已传输”意味着字节穿过某个接口。我认为7.19.6.3所指的接口是
printf
和设备驱动程序之间的接口,而7.19.3所指的接口是设备驱动程序的输出

此外,我认为您提出的解释会使
printf
的返回值变得任意和多变

因此,我得出结论,示例代码中的
printf
将始终返回3

#include <stdio.h>
#include <assert.h>

// PRECONDITION: `stdout` is fully buffered
int main()
{
   int n = printf("abc");  // "abc" is accumulated, and no transmission.
   assert(n == 0);         // so, return value can be equal to 0 ??
}