为什么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函数有)。
double a;
//float a;
// run time check failure #2 - Stack around the variable 'a' was corrupted
// 运行时检查失败#2-变量'a'周围的堆栈已损坏
// 错误在于:输入的%lf是8字节double双精度,然后给float类型a变量4个字节会发生溢出损坏
// 一般输入使用 %f -> float类型,%lf -> double类型
scanf("%lf", &a);
//scanf("%f", &a);
// 一般输出使用 %f -> float类型或者double类型都可以
// ,只是现代编译器都扩展了 %f和%lf的输出方式,但是一般使用%f就可以了
printf("%d,%f", sizeof(a),a);
为什么printf()用%f输出double型,而scanf却用%lf呢?的更多相关文章
- 为什么printf()用%f输出double型,而scanf却用%lf呢?
之前没有注意过这个问题, 转自: http://book.51cto.com/art/200901/106880.htm 问:有人告诉我不能在printf中使用%lf.为什么printf()用%f输 ...
- double型(双精度型)的打印(printf) 和scanf
double型,printf()用%f输出,而scanf用%lf来接受输入. 格式 printf scanf %c int char * %d, %i int int * %o, %u, %x u ...
- 只使用处理I/O的printDigit方法,编写一种方法一输出任意的double型量(可以是负的)
/** * Question:只使用处理IO的printDigit函数,编写一个过程以输出任意double型量(可以为负) * @author wulei * 这道题我的理解是使用最基本的System ...
- C语言中printf的规范输出
1.调用格式为 printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另 ...
- [转载]为什么使用%lf读取double型的值,而用%f进行显示?
博客地址:http://blog.csdn.net/shenzhou111/article/details/7826444 今天看到一篇好文章,mark一下. 出去旅游了一下,所以有些天没敲代码,于是 ...
- 使用random输出10个double型的随机数
使用random输出10个double型的随机数 代码如下: package Day05;import java.util.Random;import java.util.Scanner; publi ...
- ①创建项目testpackage ②在pack2.B中添加方法f ③在类A中添加如下三个成员变量:int型的私有变量i float型的变量f double型的公有变量d 在pack1.B的main方法中为对象a的成员变量f和d分别赋值为2和3 在pack2.C的main方法中为对象a的成员变量d赋值为3
package pack1; public class A { private int i; float f; public double d; public float getF() { retur ...
- double 型变量的输入输出标准格式
c语言double型变量标准输入格式: scanf("%lf",num); 标准输出格式: printf("%f\n",num); 注:有过输出用%lf输出OJ ...
- 最好使用%f输出浮点数据,acm
今天做题的时候发现使用%lf输出的时候总是wrong,而一旦改成%f就ac了,询问学长后知道,不要用%lf输出,浮点都用%f 然而我还是有疑惑,如果%f容不下输出的数据怎么办呢? 于是我就去百度 原来 ...
随机推荐
- Jmeter学习笔记(十七)——jmeter目录结构
原文链接:http://www.cnblogs.com/zichuan/p/6938772.html 一.bin目录examples: 目录中有CSV样例 jmeter.bat windows的启 ...
- 编译 Unity 4.3.1 引擎源码
引言 Unity 官方从 Unity 2017.1 版本开始,开源了引擎和编辑器的C#源码(源码地址:UnityCsReference),但核心的 C/C++ 部分源码并未开源. 编译环境 网上主要的 ...
- 2.live555源码分析----服务端doEventLoop()函数分析
上一篇博客说道,live555服务端main函数做的最后一件事就是调用如下代码陷入死循环: env->taskScheduler().doEventLoop(); // does not ret ...
- RTSP协议介绍 (转)
1. 实 时流协议RTSP RTSP[3]协 议以客户服务器方式工作,它是一个多媒体播放控制协议,用来使用户在播放从因特网下载的实时数据时能够进行控制,如:暂停/继 续.后退.前进等.因此 RTSP ...
- 【DATAGUARD】物理dg的failover切换(六)
[DATAGUARD]物理dg的failover切换(六) 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你 ...
- VMware 设置虚拟机Centos 上网的两种方式
能在VMware上面安装虚拟机,不可能说是不让链接外网,只是在自己电脑上玩玩就可以了.因为学习需要,经常在自己笔记本上面搭建虚拟机,我经常使用的两种上网方式 一 NET方式上网 设置VMware Ne ...
- Mybatis返回表自增id
在Mapper中,设置insert中添加useGeneratedKeys = "true" keyProperty = "id" keyColumn=&qu ...
- 【转】SetWindowText 的用法
SetWindowTextW表示设置的字符串是WCHAR (双字节字符 )SetWindowTextA表示设置的字符串是CHAR (单字节字符 )SetWindowText表示设置的字符串是自动匹配当 ...
- js 判断浏览器是pc端还是移动端
if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) { //说明是移动端 } else { //说明是pc端 }
- SQL进阶系列之5外连接的用法
写在前面 SQL本身是作为一种数据提取工具而出现,使用SQL生成各种定制化报表和非定制化报表并非SQL原本用途的功能,但这并不意味着SQL无法实现这些功能. 用外连接进行行列转换(1)(行 → 列): ...