为什么我在像1/2这样的浮点表达式中得到零?

时间:2015-06-27 03:18:16

标签: c floating-point

可以请某人解释这个行为:

#include <stdio.h>

int main(int argc, char **argv){

   printf("%f", ( 1 / 2 ) );     
   return 0;

} 

/* output : 0.00000 */

2 个答案:

答案 0 :(得分:2)

1 / 2不是浮点表达式。

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

内括号是不必要的;这有点容易阅读:

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

在大多数情况下,C中表达式的类型由表达式本身决定,而不是由它出现的上下文决定。这甚至适用于较大表达式的子表达式。

算术运算符+-*/始终采用相同数字类型的两个操作数,并生成该类型的结果。有些规则可以将操作数转换为通用类型,但12都是int类型,所以我们不必担心。如果使用int个操作数调用,则所有这些运算符都会产生int结果。整数除法截断,丢弃任何余数,因此1 / 2会产生int0

所以上面相当于:

printf("%f", 0);

"%f"格式需要double类型的参数; 0的类型为int。对于大多数函数,会有隐式转换,但参数的类型由格式字符串确定,而不是由函数声明确定,因此编译器不知道要转换为什么类型。 (请考虑格式字符串不必是字符串文字。)使用int格式传递"%f"参数具有未定义的行为。在您的情况下,它恰好打印0。我们可以推测这是怎么发生的,但没关系;你需要修复代码。

如果您想打印int值,可以使用"%d"

printf("%d", 1 / 2);

但你可能想要0.5。您可以通过使用double类型的操作数来获得它:

printf("%f", 1.0 / 2.0);

(您可以将两个操作数中的一个更改为浮点常量,但更改两者都更清楚。)

最后,您应该在输出结尾处打印换行符:

printf("%f\n", 1.0 / 2.0);

答案 1 :(得分:1)

究竟是什么Quantdev说的。编写C语言的人认为“嘿,让任何两个整数的红利都是一个整数,”因为整数是非常有用的,当你试图索引一个整数时可能会弄乱你的风格。阵”。因此C编译器继续将剩余部分扔进垃圾箱中,然后剩下0。

1 / 2

要声明你想要你的双重,(或漂浮),你最好让分区中的两个数字之一浮动!因此,

1 / 2.0

,在上下文中......

不是你想要的:

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

你想要什么:

printf("%f", ( 1 / 2.0 ) ); ,