2007年3月12日星期一

关于函数printf()

printf()函数有一个可变参数列表。在其实现里,先通过第一个参数找到可变参数列表的首地址,然后根据可变参数的类型依次定位。而所依据的类型则是在第一个参数──即格式化字符串中给出的。因此格式化字符串中必须给出与后面可变参数列表中各个参数相一致的类型,否则则会发生意想不到的结果,如下面一个例子:
int main()
{
float n1 = 11.11;
double n2 = 222.222;
long n3 = 3333;
long n4 = 4444;

printf("Right: %f,%f,%ld,%ld\n",n1,n2,n3,n4);
printf("Wrong: %ld,%ld,%ld,%ld\n",n1,n2,n3,n4);

return 0;
}

其输出结果为:
root@BlueIris:~# ./printf_type
Right: 11.110000,222.222000,3333,4444
Wrong: -536870912,1076246609,-1614907703,1080805146
%f指示应该在内存中往后读8个字节,而%ld只有4个,因此出现偏差。

参考:深入printf

没有评论: