minGW在fprintf与fscanf操作long double类型时偷的懒

前言

当年没少跳printfscanf输出输入double类型数据的坑。所以在研究c99标准的时候特别注意了关于fprintffscanf关于输出浮点型数的说明。
原来在使用printf输出double的时候,转义字符应该为%f或者%F
fprintf_fF
而在使用scanf输出double的时候,转义字符应该为%lf或者%lF
fscanf_ellfscanf_f而更加气人的是,纠结了老半天该用大写F还是小写f,到最后却发现,人家只是在输出诸如nan/NAN, inf/INF之类的字母的时候,指定大小写罢了(此处省略一万只草泥马)。
fprintf_f_cap
然鹅,解答了上述疑问之后,本着乐于探(zhe)索(teng)的精神,看了看fprintffscanf的其它定界符和修饰符。诶,这个修饰符看起来似乎眼熟…

  • fprintfL修饰符
    fprintf_L
  • fscanfL修饰符
    fscanf_Llong double啊,记忆中从来没用过这么高精的浮点数。毕竟一般情况没必要,double都显得太多,float就足够了。
    于是我试了一试long double的格式输入输出,没想到捅出一个惊~天~大~秘~密~2333
    那就是minGW在long double的处理上偷懒了,然鹅linux下的gcc毛事没有!看测试。

准备工作

环境

所使用的测试环境:免责声明做的倒还挺全,哼

  • Windows-minGW64:
    cmd_gccver
  • WSL Ubuntu 18.04:
    bash_gccver
    可以看到,Win下的minGW版本还领先linux自带的gcc一年。

测试代码

在Windows下和WSL下分别写了两个功能相同的demo。不用在意变量名了啦

  • Windows:type double.c
    cmd_src_prev
  • linux:喵 double.c
    在这里插入图片描述

验证

编译阶段

为了更好地看到FSF的不负责任编译时期的错误信息,我们打开-Wall,将显示所有警告信息。这次我们换个顺序,先试linux,再测试Win。

  • linux
    bash_compile可以看到,gcc默默地完工,没给出任何警告,一切都是那么的和谐。常言道:No news is good news.

  • Windows
    cmd_compileExcuse me喵喵喵?老哥你怎么了?警告咋恁多?
    仔细研读警告信息,发现就一个事情,嚷嚷了八遍。顺带吐槽一下gcc的错误提示是真的长

minGW-gcc: f前面接L?自从我在Windows上出生,就没见过这玩意。

总而言之,就两个字:不认%Lf

运行

不认就不认呗,反正过编了。俗话说的好:码不在多,过编就行
来康康我们的运行结果。

  • linux
    bash_run
    不错,您的输出完美地解决了我的问题!
  • Windows
    cmd_run
    额。。警告没好货,果然翻车了。。

失败的解决方案:花式换格式字符

换了包括但不仅限于如下格式字符:
%lf, %llf, %lF, %llF, %LF,无一不翻车。
好吧,老实一点,double真香。

延伸探究:输入的数据去哪了?

那么使用%Lf输入的数据去哪

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值