繁体   English   中英

在整数和浮点数上打印运算结果

[英]Printing the result of operations on integers and floats

考虑以下C程序:

int main() {
    int a =2;
    float b = 2;
    float c = 3;
    int d = 3;
    printf("%d %f %d %f %d %f %d %f\n", a/c, a/c, a/d, a/d, b/c, b/c, b/d, b/d);
    printf("%d\n", a/c);
}

输出为:

 0 0.666667 0 0.666667 2 0.666667 0 0.666667
 539648

我完全无法理解这一点。 为什么将a / c打印为整数给出0,而将b / c打印给出2? 在涉及浮点数和整数的计算中,不是所有整数都提升为浮点数吗? 因此,在两种情况下答案都应为0。

在输出的第二行中,我只是将a / c打印为整数,由于某种原因,它给出了垃圾值(即使当我在第一个复合printf语句中将其打印为0时,它也会给出垃圾值)。 为什么会这样呢?

您有未定义的行为:

printf("%d %f %d %f %d %f %d %f\n", a/c, a/c, a/d, a/d, b/c, b/c, b/d, b/d);

printf的格式说明符必须与所提供参数的类型匹配。 由于printf不提供带有类型的参数列表,而仅提供...除了标准类型转换外,没有隐式类型转换。

如果您有UB,基本上任何事情都可能发生。

可能发生的情况如下:

根据格式说明符, printf从调用参数中消耗一定数量的字节。 此字节数与指定的格式类型匹配。 如果字节数与作为参数传递的字节数不匹配,则所有后续参数都不同步。 当然,您对数据进行了错误的解释。

对于符合C标准的启动器,应声明无参数的main函数,例如

int main( void )

例如,如果您有以下声明

int a =2;
float c = 3;

然后通过以下方式调用函数printf

printf( "%d", a / c );

然后幕后发生了以下事件。

由于通常的算术转换 ,表达式a / c具有float类型。

当函数printf用省略号表示时,然后对float类型的a / c表达式应用默认的参数提升 ,将表达式转换为double类型。

作为该调用的结果,尝试使用为int类型设计的转换说明符%d输出double类型的表达式。 Hanse呼叫具有未定义的行为。

根据C标准(7.21.6.1 fprintf函数)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM