printf与scanf在处理double时的不同 - graybull's Blog

printf与scanf在处理double时的不同

graybull posted @ 2013年2月25日 21:56 in C/C++ with tags c cpp printf scanf %f , 3615 阅读

1. 在windows下,下面语句是正常执行的:

double var=0.618;

printf("%Lf\n",var);

然而,在Linux下该printf执行异常。故处理printf和scanf时避免使用 %Lf (大写L)。

2.

  • scanf 读取float:    scanf("%f",&var);
  • scanf 读取double:    scanf("%lf",&var);

3. printf 与scanf 的情况有些不同。

float var1=1.0;

double var2=1.0;

printf("%f", var1);     //都是 %f

printf("%f",var2);     //都是 %f

%f 在printf 看来是输出double变量(不是float);而float变量在传给printf时,编译器将它变成double类型。

至于%lf, printf也能正常输出。

建议统一在 printf 中使用 %f

参考:

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

(严 格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确 保可移植性,就要坚持使用%f。)。对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向 double存储大不一样,因此,scanf区别%f和%lf。

 

Avatar_small
依云 说:
2013年2月25日 23:59

不明白你在说什么,不过是什么类型的数据就使用什么样的格式化字符串,乱来会出问题的。

Avatar_small
graybull 说:
2013年2月27日 14:16

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

(严 格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确 保可移植性,就要坚持使用%f。)。对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向 double存储大不一样,因此,scanf区别%f和%lf。

Avatar_small
依云 说:
2013年2月27日 23:56

@graybull: 啊,我犯了一个很严重的错误——对于 printf,%f 就是给 double 用的!长度修饰只影响整数。

我一直以为 scanf 和 printf 的格式化字符串是对应的来着= =

Avatar_small
things to do 说:
2023年8月16日 00:40

We understand the importance of staying up to date with the latest trends and hidden gems. things to do near me constantly scours the city, uncovering new attractions and upcoming events to keep our content fresh and exciting. We aim to be your constant source of inspiration, making sure you're always in the know about the hottest happenings.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee