标签:
在C语言中,printf()是最常用的输出函数。printf()的使用很简单,如要打印Hello,World!这个字符串,只需运行:
printf("Hello,World!");
这样就会在屏幕上输出hello,World!这个字符串。
printf不仅可以输出常量,还可以输出变量。如要打印上面的字符,还可以:
#include<stdio.h>
#define HW "Hello,World!"
int main(void)
{
printf("%s", HW);
return 0;
}
其中"%s"是一个转换说明符,表示将要输出的是一个字符串,后面的HW则是要打印的字符串。
使用这种方式,在printf中可以使用多个转换说明符,需特别注意的是,""(双引号)中转换说明符的个数和类型必须与后面的参数完全一致,否则可能会不能输出或得不到想要的结果。
这里有一个情况需特别注意,先看下面的程序:
#include<stdio.h>
int main(void)
{
float n1 = 123.45;
float n2 = 456.78;
long n3 = 12000000;
long n4 = 34000000;
printf("n1 = %ld, n2 = %ld, n3 = %ld, n4 = %ld\n", n1, n2, n3, n4);
return 0;
}
在这段代码中,试图使用转换说明符%ld打印float型和long型数据,其输出结果为:
n1 = -1073741824, n2 = 1079958732, n3 = -536870912, n4 = 1081904250
其结果完全错误。这中错误与printf()函数的打印过程有关,下面重点介绍。
当执行上面的printf那一句时,后面的n1,n2,n3,n4这4个参数被传送到内存中的堆栈中,但是,float型数据会被当做double型处理,即占8个字节,而long型占4个字节。而打印数据时则是根据转换说明符的类型决定。由于上面都使用了%ld即long型的转换说明符,在打印n1时实际从堆栈中取出的是n1的前4个字节,并将其转换成一个long型数据输出。打印n2时实际取出的是n1的后4个字节。以此类推,在打印n3,n4时,虽然转换说明符匹配(都是long型),但实际取出的是n2的前4和后4个数据并输出,所以结果是完全错误的。
标签:
原文地址:http://www.cnblogs.com/msing/p/4262590.html