开发者社区> 问答> 正文

C语言中printf输出的奇怪错误

源代码很简单,就是定义一个float变量a=2.5,int变量b=2

然后将a,b分别按%d %f型输出。
当然没有按正确类型格式化输出肯定是有问题的。
但是按正确类型格式化输出也发生了很奇怪的问题。
源代码如下,VS2013下编译通过0 errors, 0 warnings。

#include <stdio.h>
int main(void)
{

float a = 2.5;
int b = 2;


printf("%d\n%f\n%d\n%f\n", a, a, b, b);    /*这条语句的输出全是错的*/
putchar('\n');

printf("%f\n%d\n%f\n%d\n", a, a, b, b);    /*这条语句的输出有两个对的两个错的,符合我的预期*/

return(0);}

输出结果如下图
screenshot

展开
收起
a123456678 2016-06-07 19:41:04 2935 0
1 条回答
写回答
取消 提交回答
  • 首先,float在这里会自动转换为double, 为了方便理解,我们在这里假设 sizeof(int) 是 4, sizeof(double) 是 8.

    然后,针对这一句:

    printf("%dn%fn%dn%fn", a, a, b, b);
    依照 %dn%fn%dn%f 去读,栈里面的数据以及读取的指针将呈现如下形式:

    (int)a_>| |4

          |_2.5_|4

    (float)a_>| |4
    (int)b_>|_2.5_|4

          |__2__|4

    (float)b_>|__2__|4
    所以呢,第一个 %d 读到的实际是 2.5 的前 4 byte。 紧接着第一个 %f 读的是 2.5 的后 4 byte, 加上下一个 2.5 的前 4 byte. 同理,第二个 %d 读到的是 2.5 的后 4 byte, 而第二个 %f 读到的是两个 2.

    好吧,是不是有点乱。C 语言中是如何定义这种在输出里"类型乱读"的现象呢?

    7.21.6 Formatted input/output functions:
    If a conversion specification is invalid, the behavior is undefined.282) If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
    如标准所言,这是 UB (未定义行为),所以至于它为何会输出你截图里的那四个数,可以不必深究。不同编译器的结果也不尽相同。

    2019-07-17 19:30:52
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载