C printf()如何在没有明确提及参数计数的情况下工作

C printf()如何在没有明确提及参数计数的情况下工作,c,printf,C,Printf,在参数数目可变的函数中,“第一个参数”是所传递的“参数总数”。但是在printf()中,我们从未提到参数计数。那么它是如何知道总参数列表的呢?printf()是如何工作的?您没有向printf提供参数计数-但是,您提供了一个格式字符串-它指定了printf应该期望的参数数量 非常粗略地说,格式字符串中的%符号数就是参数计数(尽管实际情况有点复杂)。让我们看看printf声明结构: int printf(const char *format, ...) format实际上是包含要写入stdout

在参数数目可变的函数中,“第一个参数”是所传递的“参数总数”。但是在
printf()
中,我们从未提到参数计数。那么它是如何知道总参数列表的呢?
printf()
是如何工作的?

您没有向
printf
提供参数计数-但是,您提供了一个格式字符串-它指定了
printf
应该期望的参数数量


非常粗略地说,格式字符串中的
%
符号数就是参数计数(尽管实际情况有点复杂)。

让我们看看
printf
声明结构:

int printf(const char *format, ...)
format
实际上是包含要写入
stdout
的文本的字符串


包含的嵌入格式标记稍后会被后续附加参数中指定的值替换,并根据需要相应地设置格式。

格式字符串中的转换说明符告诉
printf
它应该期望的参数数量和类型-例如,格式字符串
“在%s中有%d个元音\n”
告诉
printf
除了格式字符串之外,还需要两个参数,第一个是type
int
,第二个是
char*

由您来确保参数与格式字符串匹配。如果您没有传递足够的参数,或者参数类型与格式字符串所期望的不匹配,则行为未定义(很可能是输出混乱或运行时错误)。如果传递的参数太多,则会计算其他参数,但如果满足格式字符串,则函数将正常运行

编辑

7.21.6.1
fprintf
功能 …
2
fprintf
函数在
format
指向的字符串控制下,将输出写入
stream
指向的流,该字符串指定如何转换后续参数以进行输出。如果格式参数不足,则行为未定义。如果在参数为在emain中,多余的参数会被计算(一如既往),但会被忽略。当遇到格式字符串结尾时,fprintf函数将返回。
每个格式说明符(除了%%)和格式说明符中的每个*都有一个参数。这可能会有所帮助:“在参数数目可变的函数中,“第一个参数”是传递的“参数总数”。不,不是。大多数答案澄清了有效的
printf()
语法并确认“无参数计数”“这是必要的。然而,如果你真的想知道
printf()
是如何工作的,最好是看看它的一些实现的源代码,比如,或者。我很确定你的最后一句话漏掉了。