为什么我在像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中表达式的类型由表达式本身决定,而不是由它出现的上下文决定。 这甚至适用于较大表达式的子表达式。
算术运算符+
, -
, *
和/
总是采用相同数字类型的两个操作数,并产生该类型的结果。 有些规则可以将操作数转换为通用类型,但是1
和2
都是int
类型,因此我们不必担心。 如果使用int
操作数调用,则所有这些运算符都会产生int
结果。 整数除法截断 ,丢弃任何余数,因此1 / 2
产生int
值0
。
所以上面相当于:
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 ) ); ,