代码之家  ›  专栏  ›  技术社区  ›  gasoon

当数字的顺序与格式不对应时,为什么printf函数按顺序打印结果?

  •  0
  • gasoon  · 技术社区  · 7 年前

    当我运行以下代码时:

    printf("%d %f %d %d %f\n", 1.2 , 3000, 2.5, 400, 500);
    

    我认为答案可能是一些没有意义的数字,但结果实际上是:

    3000 1.200000 400 500 2.500000
    

    这是如此有意义,以至于我无法说服自己忽略它。

    2 回复  |  直到 7 年前
        1
  •  7
  •   Sourav Ghosh    7 年前

    为给定格式说明符提供不合适的类型是 undefined behavior ,你永远无法“证明”结果。它 看起来效果不错,但你永远不知道,在内部,它可能会将你所有的钱转移到其他帐户!!

    C11 ,第7.21.6.1章,第9页

    [...] 如果任何参数是 未定义。

    就你而言,

    • %d 期望 int double (文字 1.2 是一个 双重的
    • %f 需要一个 双重的 ,您提供了 整数

    所以,你引起了UB。

        2
  •  2
  •   user5329483    7 年前

    猜测一下:在ABI上,浮点参数通过FPU堆栈传递,整数通过CPU堆栈传递。所以当printf提取参数时,它提取 %f 来自FPU堆栈的s和POP %d s离开CPU堆栈。如果我是对的, printf("%d %d %d ***** %f %f\n", 1.2 , 2.5, 3000, 400, 500);