你留意一下标准库里面的stdarg.h文件,它里面定义了几个宏,分别是va_start、va_arg、va_end,这几个宏都是用来做不定参数传递的。特别注意的是va_arg在获取传递进来的参数时依赖它的第二个参数(t,类型),如果类型不对应的话会导致整个不定参数的传递没法正常的解析(错位)。prinft依赖于vsprintf,而vsprintf的实现依赖这几个宏,它会根据格式字符串(也就是那些%d %f ...)来调用va_arg,如果你的格式字符串和你后面的不定参数没有正确对应起来,那么也有可能在获取不定参数时出现错位(而你第二个输出对了两次也是因为错位了两次之后刚好又对上了的缘故)。

还有float(32位)参数在传递printf的时候会自动转换成double(64位)(这也是%f和%lf没区别的缘故),int参数占32位。

有了上面的铺垫之后,下面来解释你的这个问题。

环境:Windows XP 32, gcc version 3.4.0 (mingw special)

注:以下连续的十六进制数据从左到右对应于内存地址的由低到高

你传入的参数a,a,b,b,对应十六进制的00 00 00 00 00 00 04 40 00 00 00 00 00 00 04 40 02 00 00 00 02 00 00 00正确的分割应该是:

a: [00 00 00 00 00 00 04 40]

a: [00 00 00 00 00 00 04 40]

b: [02 00 00 00]

b: [02 00 00 00]

根据你的第一次输出的格式字符串,printf做了如下的分割:

%d: [00 00 00 00] int,对应0x00000000,也就是0了

%f: [00 00 04 40 00 00 00 00] double,0.0,(看double的表示法)

%d: [00 00 04 40] int,对应0x40040000,也就是10进制的1074003968

%f: [02 00 00 00 02 00 00 00] double,0.0

所以输出也就是:

0

0.000000

1074003968

0.000000

而根据你第二次输出的格式字符串,printf做了如下的分割:

%f: [00 00 00 00 00 00 04 40] double, 对应2.5

%d: [00 00 00 00] int 对应0

%f: [00 00 04 40 02 00 00 00] double,对应0

%d:[02 00 00 00] int 对应0

也就是你看到的:

2.500000

0

0.000000

2

至于为什么好几次double都变成0.0,你需要去看看IEEE的double表示标准。

简而言之就是:printf的在做输出的时候会根据格式字符串来获取传递进来的不定参数,而错误的格式字符串会导致不定参数的获取错误,从而导致输出错误。

c语言printf输出字符表情,C语言中printf输出的奇怪错误相关推荐

  1. c语言printf函数的作用,c语言中printf用法及其函数定义

    c语言中printf用法及其函数定义 发布时间:2020-04-09 10:51:14 来源:亿速云 阅读:354 作者:小新 今天小编给大家分享的是c语言中printf用法及其函数定义,很多人都不太 ...

  2. c语言输出的时候让字符占五位,C语言中printf的规范输出

    1.调用格式为  printf("", ); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%" ...

  3. 关于C语言中printf函数“输出歧视”的问题

    目录 关于C语言中printf函数"输出歧视"的问题 问题描述 探索问题原因 另一种研究方法 问题结论 关于C语言中printf函数"输出歧视"的问题 问题描述 ...

  4. c语言中 printf(quot;nquot;),关于C语言 printf(quot;%d\nquot;,printf(quot;%dquot;,printf(quot;%dquot;...

    luokaiwei19824级被浏览104次2013.10.11 检举 #include int main(){ int i=43; printf("%d\n",printf(&q ...

  5. 利用c语言中printf输出图形

    c语言中利用printf输出图形 通过对c语言中printf的使用,我根据自己对*符号的排版利用dev c++编译出了一个菱形的图案.感受到了通过高级程序语言输出自己构建的内容的乐趣.在这个过程中,计 ...

  6. c语言中printf格式大全,printf()输出格式大全

    学习了<C语言printf()和puts()的简单使用>,大家应该能够使用 printf() 输出简单格式的数据了,%d.%f.%c 和 %s 只是 printf( ) 的格式控制字符串中 ...

  7. c语言程序输出s是什么,C语言中printf格式化输出函数

    int printf(const char *format,[argument]); format 参数输出的格式,定义格式为: %[flags][width][.perc] [F|N|h|l]typ ...

  8. c语言printf双精度还需要lf,C语言中printf区分双精度和单精度吗?为什么用lf输出不了双精度浮点数?...

    c语言中用printf输出是区分单精度和双度的. 如果用户在函数定义时定义为双精度,最后用printf输出时既可以用printf("%lf",a);也可以用printf(" ...

  9. c语言求字符ascii,C语言中ASCII码是什么意思? c语言怎么求字符的ascii码

    导航:网站首页 > C语言中ASCII码是什么意思? c语言怎么求字符的ascii码 C语言中ASCII码是什么意思? c语言怎么求字符的ascii码 相关问题: 匿名网友: 是一个字符表,一个 ...

最新文章

  1. Android 隐式跳转(Activity的隐式跳转)
  2. 开心周末:这就是2018年的我~
  3. java set如何判断重复_set 怎么用iterator()方法来区分重复与否
  4. win10 x64+anaconda+labelme标注数据
  5. 1812:网格_指导设计:网格的历史
  6. 怒怼腾讯加班的应届生本人回应:已找到新工作
  7. java中的fd是什么意思_java中关键字和保留字分别是什么意思
  8. 导出到word时,报错
  9. sysmon安装报错“error getting the evt dll (wevtapi.dll): 87”解决办法
  10. 算法与数据结构1800题 图
  11. linux终端安装搜狗输入法rpm,Linux下deb包安装工具(附带安装搜狗输入法)
  12. 苹果10.13.6,开机的时候经常会显示 禁止符号
  13. 计算机网络8832号答案,年月份自学考试计算机网络原理答案36.doc
  14. 在设计四人抢答器中灯全亮_四路竞赛抢答器的设计
  15. DDD优秀实践及总结——规范总结
  16. 艾永亮:产品决策是不是应该老板来做?
  17. DSNIRNXT:53CD abend during query
  18. Agile方法研究综述
  19. 国内可用的ntp服务器地址
  20. 消息中间件(一)分布式系统事务一致性解决方案大对比,谁最好使?(转)...

热门文章

  1. 高通骁龙665能不能升级鸿蒙系统,骁龙662处理器好吗 骁龙662和骁龙665谁更好
  2. 2022年网络搭建与应用——国赛FTP搭建 (解题步骤答案)
  3. 拥抱院外处方药,互联网医疗也要“脱虚向实”?
  4. python查看电脑配置_怎么看电脑配置_怎么查看电脑配置好坏|信息【图文】-太平洋IT百科...
  5. 【环境问题】Anaconda-Navigator 更新后无法打开,运行出现UnicodeDecodeError的解决方案
  6. 【转帖】2018年Windows漏洞年度盘点
  7. 石沉大海的简历和优质简历的差别
  8. 如何找回OneNote 误删、丢失的笔记
  9. 关于-超融合架构(Hyper-converged)市场产品区别和决策标准
  10. 投影html连接电脑,电脑如何链接投影仪_台式电脑主机怎么连接投影仪-win7之家...