在具有可变数量的参数的函数中,"第一个参数" "参数总数"被通过。但在printf()
中,我们从未提及参数计数。那么它如何了解总参数列表呢? printf()
如何运作?
答案 0 :(得分:3)
您没有向printf
提供参数计数 - 但您确实提供了格式字符串 - 而且它指定了printf
应该预期的参数数量。
非常粗略地说,格式字符串中%
个符号的数量是参数计数(尽管现实有点复杂)。
答案 1 :(得分:3)
让我们看看printf
声明结构:
int printf(const char *format, ...)
format
实际上是包含要写入stdout
的文本的字符串。
包含的嵌入格式标记稍后将被后续附加参数中指定的值替换,并根据需要相应地设置格式。
答案 2 :(得分:1)
格式字符串中的转换说明符告诉printf
它应该期望的参数的数量和类型 - 例如,格式字符串"there are %d vowels in %s\n"
告诉printf
除格式字符串外,还需要两个参数,第一个是int
类型,第二个是char *
。
由您来确保参数与格式字符串匹配。如果没有传递足够的参数,或者参数类型与格式字符串所期望的不匹配,那么行为是 undefined (很可能是乱码输出或运行时错误)。如果传递太多参数,则会计算其他参数,但只要满足格式字符串,函数就会正常运行。
修改强>
7.21.6.1fprintf
功能
...
2fprintf
函数在stream
指向的字符串的控制下将输出写入format
指向的流,该字符串指定后续参数如何转换为输出。如果格式的参数不足,则行为未定义。如果参数保留时格式已用尽,则会评估多余的参数(一如既往),否则将被忽略。当遇到格式字符串的末尾时,fprintf函数返回。