已有的几个高赞回答,都很好。不过我感觉离真相,或者说是题主的预期,还是差那么一点点。所以,我再补充一下。 首先,题主所说的%d这类格式化字符串并不是 C 语言本身的标准或者规范,而是printf或者说标准 IO 接口实现当中的一种约定。 然后根据情况调用上面这些函数。比如我们要输出三个整数(int 型)a, b, c,中间用空格分开,就可以这么写我们的代码: 如此实现我们的格式化输出功能,就可以不用 `%d` 这样的格式化字符串,但也一样可以完成标准 IO 接口 `printf` 实现的各种输出。 可变参数。在格式化字符串的后面,可以指定任意数量、任意类型的需要格式化的东西,这些东西可以是具有明确类型的值,或者一个指针,或者一个以 NULL 字符结尾的字符串地址(本质上也是指针)。 使用格式化字符串中的格式化标记字符来依次指定其后那些传入的东西的类型,比如是整数、浮点数还是指针或者一个字符串,以及输出这些东西时的格式,比如是否使用科学记数法。 可变参数带来了巨大的灵活性:以上那么多的接口,最终可以缩减为单个或者有限的几个接口,这大大降低了学习难度。 如其他回答所指出,编译后的 C 语言代码就是机器码,类型只在 C 语言这一级有意义,机器码是不知道一个值代表的到底是一个整数、一个浮点数还是一个地址(指针),所以我们需要使用 `%d` 这样的标记字符来表明要打印的东西的类型。 等形式的格式标记字符,我们可以灵活地控制我们输出这些东西的格式,而不用增加额外的参数或者接口来说明输出格式,而且还可以不停地扩展。这也是为什么 至于另外一个回答中提及的类型提升(type promotion),则是实现可变参数函数时,为了解决一些历史遗留问题和兼容性而引入的一种对编译器的规范要求,当然这些问题和printf的设计有一些关系。但本质上和题主的问题没有必然联系,但可以当做扩展资料阅读。 |