3.6 参数和陷阱
双引号中的字符序列被称为字符串(string)。无论双引号中包含多少个字符和标点符号,一个字符串就是一个参数。
C语言用逗号分隔函数中的参数。printf()和scanf()函数与一般函数不同,它们的参数个数是可变的。程序需要知道函数的参数个数才能正常工作。printf()和scanf()函数用第1个参数列表表明后续有多少个参数,即第1个字符串中的转换说明与后面的参数一一对应。
程序员要负责确保转换说明的数量、类型与后面参数的数量、类型相匹配。现在,C语言通过函数原型机制检查函数调用时参数的个数和类型是否正确。但是,该机制对printf()和scanf()不起作用,因为这两个函数的参数个数可变。
/* badcount.c -- incorrect argument counts */
#include
int main(void)
{
int n = 4;
int m = 5;
float f = 7.0f;
float g = 8.0f;
printf("%d\n", n, m); /* too many arguments */
printf("%d %d %d\n", n); /* too few arguments */
printf("%d %d\n", f, g); /* wrong kind of values */
return 0;
}
/* 输出:

*/
注意,用%d显示float类型的值,其值不会被转换成int类型。在不同的平台下,缺少参数或参数类型不正确导致的结果不同。
所有的编译器都能顺利编译并运行该程序,但其中大部分会给出警告。然而C标准对此未做要求。因此,计算机在运行时可能不会捕获这类错误。