【问题标题】:C arithmetic expression inconsistency with printf and assignment to another variableC算术表达式与printf不一致并赋值给另一个变量
【发布时间】:2016-09-25 13:21:41
【问题描述】:

下面的程序为 a/100 输出不同的值,其中 a 是 int。

void main()
{
    int a = -150;
    float f;
    f = a/100;
    printf(" %f,%f ",f,a/100);
}

输出:-1.000000,0.000000

这里第二个 %f 值达到 0.000000,但怎么可能,应该是 -1.000000 或 -1.500000。

【问题讨论】:

    标签: c expression precision numeric


    【解决方案1】:

    没有不一致:

     f = a/100;
    

    执行存储到浮点数的整数除法:结果1.0

    然后

     printf(" %f ",a/100);
    

    打印一个整数 (1),但采用浮点格式:未定义的行为。

    这毫无意外:

    void main()
    {
        int a = -150;
        float f;
        f = a/100.0;
        printf(" %f,%f ",f,a/100.0);
    }
    

    printf 是一个可变参数函数(原型:void printf(const char *,...)),除了“相信”你传递的格式之外别无选择。

    如果你告诉printf第二个参数是一个浮点数,那么它会将参数字节流读取为float,如果数据与float结构不匹配,那么它就不起作用正确。

    编辑:编译器制造商知道这是一个常见错误,因此他们为类似 printf 的函数添加了特殊检查:如果您使用 gcc 使用 -Wall 或 -Wformat 选项编译文件,您将获得以下明确消息:

    foo.c:8:1: warning: format '%f' expects argument of type 'double', but argument 3 has type 'int' [-Wformat=]
     printf(" %f,%f ",f,150/100);
    

    (如果%-like 格式参数的数量和参数的数量不匹配,也一样)。

    【讨论】:

    • 那么,除非我强制转换,否则我不应该将 %f 与基础整数一起使用? (比如说,我不想使用 100.0 作为分母)。我知道当你提到的修改完成后它会正确打印。我的观点是,为什么在使用 %f 格式说明符时,它不会固有地将 int 类型转换为浮动。
    • @iharob:我在想什么 :) 已编辑。无需进一步复杂...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2013-08-29
    • 2014-12-30
    相关资源
    最近更新 更多