为什么printf()用%f输出double型,而scanf却用%lf呢?

转:https://blog.csdn.net/bat67/article/details/52056057

  • 示例:double x;scanf(“%f”,&x);输入“123.4”,输出x的值结果为0,没有接收输入的数据,再输入别的数据,结果都为0。这是因为用户定义x为双精度型数据,而用“%f”格式输入数据,仍不能接收,应该使用“%lf”或“%le”,即scanf(“%lf”,&x);此时输入“123.4”即可接收。因此长整型数据和双精度型数据必须使用附加格式说明字符l,短整型数据必须使用附加格式说明字符h。

为什么printf()用%f输出double型,而scanf却用%lf呢?
答:printf的%f说明符的确既可以输出float型又可以输出double型。 根据"默认参数提升"规则(在printf这样的函数的可变参数列表中 ,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。

对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向double存储大不一样,因此,scanf区别%f和%lf。

下表列出了printf和scanf对于各种格式说明符可以接受的参数类型。


格式


printf


scanf


%c


int


char *


%d, %i


int


int *


%o, %u, %x


unsigned int


unsigned int *

(续)


格式


printf


scanf


%ld, %li


long int


long int *


%lo, %lu, %lx


unsinged long int


unsigned long int *


%hd, %hi


int


short int *


%ho, %hu, %hx


unsigned int


unsigned short int *


%e, %f, %g


double


float *


%le, %lf, %lg


n/a


double *


%s


char *


char *


%[...]


n/a


char *


%p


void


void **


%n


int *


int *


%%


none


none

(严格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。)

PS: scanf 函数中只有“域宽”附加格式说明字符(指定输入数据所占列数),而没有“小数位数”附加格式说明字符(只有printf函数有)。

原文地址:https://www.cnblogs.com/jiangxiaobo/p/11690344.html

时间: 2024-10-09 03:03:16

为什么printf()用%f输出double型,而scanf却用%lf呢?的相关文章

C语言中printf的规范输出

1.调用格式为  printf("<格式化字符串>", <参量表>);   其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式.参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误. 2.格式化字符 %d

double型浮点数能精确到多少位小数?

问题2:double型浮点数能精确到多少位小数?或者,这个问题本身值得商榷? 既然double是浮点数,它的小数点的位置是“浮动”的,所以很难说double类型能精确到小数点后面几位.通常这个关于精度的问题都是通过它能表示的有效数字(十进制)的位数来表示的.遵循IEEE标准的8字节(64位)的double能表示的有效数字的位数是:15 ~ 16 测试一个: #include <stdio.h> int main(){ printf("%.20lf",1.0/3.0); }

printf格式化字符输出对应解释

printf 对应的字符代表的意思如下所示: printf("%_", i); /* %a:浮点数.十六进制数字和p-记数法(C99) * %A:浮点数.十六进制数字和p-记法(C99) * %c:一个字符char * %C:一个ISO宽字符 * %d:有符号十进制整数int * %ld,%Ld:长整型数据long * %hd:短整型数据 * %e:浮点数.e-记数法 * %E:浮点数.E-记数法 * %f:单精度浮点数(默认float),十进制记数法 * %.nf:这里n表示精确到小

C语言中以十六进制输出字符型变量会出现&#39;ffffff&quot;的问题

最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: C代码   char buf[10] = {0}; buf[0] = 0xbf; printf("%2x\n\n\n", buf[0]);            /*在终端将会显示成:ffffffbf*/ buf[1] = 0x7f; printf("%2x\n\n\n", bu

c语言:用%f输出实数,只能得到6位小数及求float型数据的有效位数

1.用%f输出实数,只能得到6位小数. 程序: #include<stdio.h> int main() { double a = 1.0; printf("%f\n",a/3); return 0; } 结果: 0.333333 请按任意键继续. . . 2.float型数据的有效位数. 程序: #include<stdio.h> int main() { float a; a = 10000/3.0; printf("%f\n",a);

串口输出float型数据

avr gcc中的printf函数不支持%f输出 注意在gcc中float double型数据一律处理为单精度(4 bytes) 有两种做法:  1.将浮点数分解为4个字节,分别送出,接收端再这4个字节合并转化为将浮点数 示例如下: #include <stdio.h> typedef union { float f; unsigned char u[4]; } Float4Byte; int main(void) { Float4Byte m1,m2; m1.f=-1.2356; m2.u[

如何对double型变量进行memset获得极大值或极小值

我们都知道,如果想对int型变量清极大值或极小值,我们一般选择memset(a,0x3f,sizeof a);或者memset(a,0xef,sizeof a);.然而,如果对double型清0x3f,我们经常会得到一个连1都不到的小数.那么对double清极值是否智能手动或者fill(a+1,a+n,0x7fffffff);呢? 首先我们运行以下程序 #include<cstdio> #include<cstring> #include<iostream> #incl

java定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积

需求如下:(1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积. (2)定义一个类PassObject,在类中定义一个方法printAreas(),该方法的定义如下: public void printAreas(Cirlce c, int times) 在printAreas方法中打印输出1到time之间的每个整数半径值,以及对应的面积.例如,times为5,则输出半径1,2,3,4,5,以及对应的圆面积. 在main方法

c#的double型精度控制

c#小数精度 c#中对于double型的小数如果想保留一定的精度,即小数点位数,可以在转换成字符串的时候,用参数限制:下面的程序演示了这个做法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace double精度 { //计算出一个整型数组的平均值,保留两位小数: class Program { s