C算术表达式与printf不一致并赋值给另一个变量

标签 c expression precision numeric

下面的程序输出 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。

最佳答案

没有不一致:

 f = a/100;

执行存储到 float 中的整数除法:结果 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 是一个可变参数函数(原型(prototype):void printf(const char *,...)),除了“相信”您传递的格式。

如果您告诉 printf 第二个参数是一个 float ,那么它会将参数字节流读取为一个 float,如果数据与 不匹配>float 结构,嗯,它不会正常工作。

编辑:编译器制造商知道这是一个常见错误,因此他们为类似 printf 的函数添加了特殊检查:如果您使用 -Wall 使用 gcc 编译文件-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);

(如果类似 % 的格式参数的数量和参数的数量不匹配,也是如此)。

关于C算术表达式与printf不一致并赋值给另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39687286/

相关文章:

c - 段错误(核心转储)错误 (C)

c++ - 逗号作为变量初始化中的分隔符(不是作为运算符)

javascript - 替换正则表达式中的 img 元素 src 属性

math - CLISP 中自然对数的精度不正确。可能出了什么问题?

0 到 1 之间值的 Java Float 精度

javascript - 精度和大数

android - 在android中通过JNI在C代码中打开文件时获取NULL

c - 将传输结束写入正在运行的进程的标准输入

eclipse - 更改 eclipse 的快速查看 View 颜色

javascript - 将表情符号与文本分开的正则表达式