今天编写程序发现一个问题,double型使用printf("%f")和printf("%lf")都可以正常输出,而scanf必须使用%lf。 #include <stdio.h> #include <stdlib.h> #define PI 3.1415926 int main( ) { double r, h, S; printf("输入半径:"); scanf("%f", &r); printf("输入高度:"); scanf("%f", &h); S = 2 * PI * r * r + 2 * PI* r * h; printf("圆柱体的表面积为:%f\n", S); return 0; } 这里将r,h,s 定义为double类型,scanf使用%f scanf使用%lf(可以正常计算) 之后百度总结一下 1. scanf函数和printf函数是不同寻常的函数,因为它们都没有将函数的参数限制。与其他库函数不同的是,printf 函数是一个“可变参数函数”(即函数参数的个数是可变的)。确切地说,是其输出参数的个数是可变的,且每一个输出参数的输出格式都有对应的格式说明符与之对应,同 printf 函数相似,scanf 函数也是一个“可变参数函数”。当调用带可变长度参数列表的函数时,编译器会安排float参数自动转换成为double类型,其结果是printf函数无法区分float型和double型的参数。因此在printf函数调用中%f既可以表示float型又表示double型的参数。 2. scanf函数是通过指针指向变量的。%f告诉scanf函数在所传地址位置上存储一个float型值,而%lf告诉scanf函数在所传地址位置上存储一个double型值。这里float和double的区别是非常重用的。如果给出了错误的转换说明,那么scanf函数将可能存储错误的字节数量。简单来说scanf()是通过指针来读取数据的,区分float和double类型。