C语言 把真实的转换成整数,原理是什么?[已关闭]

pkwftd7m  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(124)

已关闭。此问题需要超过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
为什么会这样?

ssm49v7z

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转换的行为。您需要使参数类型与转换规范相匹配。

jq6vz3qz

jq6vz3qz2#

该表达式

(int)((4.0f + 1) / 2) * 4.0f

计算为8.0f,因为类型转换为int的优先级高于乘法。因此,上面的表达式等效于

((int)((4.0f + 1) / 2)) * 4.0f

你可以想象被评价为

  1. 4.0f + 1 --〉5.0f
  2. 5.0f / 2 --〉2.5f
  3. (int) 2.5f --〉2
  4. 2 * 4.0f --〉8.0f
    对于你的第一个printf,优先级是这样工作的,因为对应于printf%f指令的参数必须具有double类型。默认的参数提升在这里适用,将float转换为所需的double,但它们不适用于int
    第二个输出是0,我想应该是10,为什么会这样?
    我从第二个printf得到了不同的输出(既不是8也不是10),这并不奇怪,因为%d指令要求相应的参数具有int类型,而实际上它具有double类型,如上所述。
    永远记住printfscanf化指令不仅传递想要的输出格式,而且甚至更多对应参数的期望类型。如果你没有提供正确类型的对应参数,那么所有的赌注都是输的。

相关问题