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

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

#include  int main(int argc, char **argv){ printf("%f", ( 1 / 2 ) ); return 0; } /* output : 0.00000 */ 

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

如果要打印该int值,可以使用"%d"

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

但你可能想要0.5 。 你可以通过使用double类型的操作数来实现:

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

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

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

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

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

1 / 2

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

1 / 2.0

并且,在上下文中……

不是你想要的:

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

你想要什么:

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