已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
十小时前关门了。
Improve this question
#include <stdio.h>
int main(void) {
float a;
scanf("%f", &a);
printf("%f\n", (int)((a + 1) / 2) * a);
printf("%d\n", (int)((a + 1) / 2) * a);
return 0;
}
如果我输入4
,则输出为8.0000
我认为它应该是10.0000
,因为该代码是1+2+~+n
我不知道原因。
而第二输出是0
我觉得应该是10
为什么会这样?
2条答案
按热度按时间ssm49v7z1#
printf("%f\n", (int)((a + 1) / 2) * a);
的计算公式为:1.由于
a
具有类型float
和值4,因此a+1
具有类型float
和值5。1.由于
(a+1)
具有类型float
和值5,因此(a+1) / 2
具有类型float
和值2½。1.由于
(a + 1) / 2
具有类型float
和值2½,因此((a + 1) / 2)
具有类型float
和值2½。1.由于
((a + 1) / 2)
具有类型float
和值2½,因此(int) ((a + 1) / 2)
具有类型int
和值2。1.由于
(int) ((a + 1) / 2)
具有类型int
和值2,并且a
具有类型float
和值4,因此(int)((a + 1) / 2) * a
具有类型float
和值8。1.参数类型为
float
且值为8的printf("%f\n",…_);
将8转换为“8.000000”并打印出来。(在此调用中,float
参数自动提升为double
。)在
printf("%d\n", (int)((a + 1) / 2) * a);
中,参数也是float
类型,值为8。C标准没有定义传递float
类型的参数以进行%d
转换的行为。您需要使参数类型与转换规范相匹配。jq6vz3qz2#
该表达式
计算为
8.0f
,因为类型转换为int
的优先级高于乘法。因此,上面的表达式等效于你可以想象被评价为
4.0f + 1
--〉5.0f
5.0f / 2
--〉2.5f
(int) 2.5f
--〉2
2 * 4.0f
--〉8.0f
对于你的第一个
printf
,优先级是这样工作的,因为对应于printf
的%f
指令的参数必须具有double
类型。默认的参数提升在这里适用,将float
转换为所需的double
,但它们不适用于int
。第二个输出是0,我想应该是10,为什么会这样?
我从第二个
printf
得到了不同的输出(既不是8也不是10),这并不奇怪,因为%d
指令要求相应的参数具有int
类型,而实际上它具有double
类型,如上所述。永远记住
printf
和scanf
化指令不仅传递想要的输出格式,而且甚至更多对应参数的期望类型。如果你没有提供正确类型的对应参数,那么所有的赌注都是输的。