【问题标题】:printf in gcc wrong resultgcc中的printf错误结果
【发布时间】:2013-12-18 08:38:18
【问题描述】:

案例 1: gcc 输出中的printf("%f",(7/2)); 为 0.000000。

案例 2: float k= 7/2; gcc 中的printf("%f",k); 输出为 3.000000。

在第一种情况下 printf 期望浮点数但得到整数所以给出错误的结果。但在第二种情况下,它会进行类型转换。

这是我的问题-

  1. 为什么 gcc 在第一种情况下不给出类型不匹配错误/警告?
  2. 在第二种情况下,它默认进行类型转换,但为什么不在第一种情况下呢?

【问题讨论】:

    标签: c gcc floating-point


    【解决方案1】:

    在第二种情况下,它默认进行类型转换,但为什么不在第一种情况下呢?

    在第一种情况下,72 都是 int 类型。将7 除以2 将得到int。用%f 打印它会调用未定义的行为。你会得到任何东西。在这种情况下,没有类型转换。

    试试这个

    printf("%f", (7.0/2));  
    

    在第二种情况下,kfloat 类型,因此7/2 的结果默认转换为k 的类型。

    为什么 gcc 在第一种情况下不给出类型不匹配错误/警告?

    使用-Wall 标志编译第一条语句会给出警告:

    [Warning] format '%f' expects argument of type 'double', but argument 2 has type 'int' [-Wformat=]
    

    【讨论】:

      【解决方案2】:

      GCC 可以发出警告,但您没有启用它。尝试使用标志-Wall 编译,你会看到:

      warning: double format, different type arg (arg 2)
      

      【讨论】:

        【解决方案3】:

        1) 默认情况下,gcc 不会检查带参数的格式字符串中的类型 - 因此它会将数据(即整数)“解释”为浮点 在运行时

        2) gcc 现在将浮点数解释为浮点数在运行时

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多