当你想打印一个类型的值float
或double
使用函数printf()
时,你可以使用这%f
两种数据类型的说明符。例如:
double d = 3.5;
float f = 4.5;
printf("Valores: %f %f", f, d);
而在函数的情况下scanf()
,说明符用于%f
读取 a float
,说明符%lf
用于读取 a double
:
double d;
float f;
printf("Introduce un float y un double: ");
scanf("%f %lf", &f, &d);
float
为什么类型和double
in有不同的说明符scanf()
,但 in 有相同的说明符printf()
?
当类型值作为参数传递给具有可变数量参数的函数时,C 语言执行从
float
todouble
float
的隐式转换,就像在 function 的情况下一样printf()
。因此,无论是传递一个值float
还是传递一个double
,函数printf()
都会接收一个值double
,说明符被设置%f
为打印类型值double
到printf()
在
scanf()
值(类型float
或double
)不作为参数传递的情况下,而是将指针与存储读取值的内存地址一起传递。指针不是由 C 隐式转换的,此外函数scanf()
必须知道每个变量是什么类型的数据,它将存储每个读取的值,以免占用大于保留或未保留的内存区域将格式不正确的数据保存到相应的变量中。因此,每个具有相应数据类型的变量都需要一个特定的说明符。从C99标准开始,为每个浮点数据类型建立了一个特定的说明符,包括 for
printf()
和 forscanf()
:使用
printf()
带有说明符的函数%f
仍然可以安全地使用float
或类型的参数double
。此外,使用%f
or%lf
类型的值没有区别float
ordouble
。在它们之间的所有可能组合中,printf()
它隐式转换double
并打印它。但是使用%lf
带值float
或%f
带值的说明符double
被认为是不好的做法,应该避免,即使它最初不会引起问题。为了编写此解决方案,已使用英文 SO 条目中的大部分信息:https://stackoverflow.com/questions/210590/why-does-scanf-need-lf-for-doubles-when-printf -is-没关系,只是-f