可以请某人解释这个行为:
#include <stdio.h>
int main(int argc, char **argv){
printf("%f", ( 1 / 2 ) );
return 0;
}
/* output : 0.00000 */
答案 0 :(得分:2)
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
。对于大多数函数,会有隐式转换,但参数的类型由格式字符串确定,而不是由函数声明确定,因此编译器不知道要转换为什么类型。 (请考虑格式字符串不必是字符串文字。)使用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 ) ); ,