【问题标题】:Can anyone explain the output谁能解释一下输出
【发布时间】:2013-05-24 09:56:59
【问题描述】:

如果我尝试将float 打印为int,则此代码:

main () {                         
    float a = 6.8f;                      
    printf("%d", a);                      
}                       

打印 1073741824,而这段代码:

main () {            
    float a = 9.5f;           
    printf("%d", a);            
}                   

打印 0。

输出是否未定义? %f 何时与整数一起使用,%d 何时与双精度一起使用?

【问题讨论】:

  • 输出是垃圾还是未定义的操作?
  • 同时调用一个函数,该函数接受可变数量的参数 (printf()),但范围内没有原型是 UB。使用#include <stdio.h> 获得正确的原型。

标签: c floating-point double output undefined-behavior


【解决方案1】:

不仅是输出,整个程序都有未定义的行为,因为您传递给 printf() 的值的类型与格式字符串期望的类型不匹配。

【讨论】:

  • 即使是 编译 源调用 UB 的行为 :)
【解决方案2】:

来自 C99 标准部分 7.19.6.1 的 fprintf 函数

如果任何参数不是相应转换规范的正确类型,则行为未定义。

%d 需要 int,而不是 float,因此程序具有未定义的行为(包括输出)。

【讨论】:

    【解决方案3】:

    如之前的答案所述,如果打印格式与传递的类型不匹配,则会显示未定义的行为。

    如果您想将整数视为浮点数,则需要对其进行类型转换。

    int j = 5;
    printf("%f",(float)(j));
    

    这会将输出打印为 5.0,即作为浮点数

    【讨论】:

      【解决方案4】:

      C 标准规定 printf 格式必须与传入的类型匹配。如果不匹配,则行为明确未定义:

      C99, 7.19.6.1 # 9 (fprintf)

      如果转换规范无效,则行为是 undefined.239) 如果任何参数不是正确的类型 相应的转换规范,行为未定义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        • 1970-01-01
        • 2022-01-03
        • 2021-04-24
        • 1970-01-01
        • 2017-04-07
        • 2015-12-21
        相关资源
        最近更新 更多