基础知识 | 每日一练(133)

基础知识练

士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ——菜根谭

读者:为什么调用 printf() 前, 必须要用 #include <stdio.h>?

小林:为了把 printf() 的正确原型说明引入作用域。对于用可变参数的函数, 编译器可能用不同的调用次序。例如, 如果可变参数的调用比固定参数的调用效率低。所以在调用可变参数的函数前, 它的原型说明必须在作用域内, 编译器由此知道要用不定长调用机制。在原型说明中用省略号“…” 来表示可变参数。

读者:为什么 %f 可以在 printf() 参数中, 同时表示 float 和 double?他

们难道不是不同类型吗?

小林:“参数默认晋级” 规则适用于在可变参数中的可变动部分: char 和 short int 晋级到 int, float 晋级到 double。同样的晋级也适用于在作用域中没有原型说明的函数调用, 即所谓的 “旧风格” 函数调用, 参见问题 11.4。所以 printf 的 %f 格式总是得到 double。类似的, %c 总是得到 int, %hd 也是。

正文完